SoundPoolはMediaPlayerと違って事前にデコードしてオーディオデータを保持するため、メモリは消費しますが、遅延なく即座に再生できるということで効果音に向いています。効果音を複数同時再生することも可能です。
使い方もシンプルでSoundPoolのインスタンスを作成して、そこにオーディオデータをロードします。このロードは非同期処理で多少時間がかかり、ロード完了前に再生しようとすると"sample 1 not READY"のような警告ログがでます。そのため必要であればOnLoadCompleteListenerでロード完了通知を受け取ることもできます。ロードが完了したら、あとは再生を実行するだけで、いつでも再生できます。完全に使い終わったら、release()で全リソースを解放します。
再生できるオーディオフォーマットはMediaPlayerと同じですが、あまり巨大なファイルなどはデコードエラーがでて使えないことがあります。その場合、SoundPoolからエラーログがでますので、そのときはオーディオデータを疑いましょう。
例)ボタンをクリックすると2つの効果音(mp3)を同時に再生する場合、onCreate()で事前にロードまで完了させておき、ボタンをクリックしたら再生するように記述します。
public class SampleAppActivity extends Activity {
private final static String TAB = "SampleAppActivity";
private SoundPool mSePlayer;
private final static int MAX_STREAMS = 10;
private int[] mSound = new int[5];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSePlayer = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, 0);
mSound[0] = mSePlayer.load(getApplicationContext(), R.raw.se1, 1);
mSound[1] = mSePlayer.load(getApplicationContext(), R.raw.se2, 1);
Button button = (Button) findViewById(R.id.play);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSePlayer.play(mSound[0], 1.0f, 1.0f, 0, 0, 1.0f);
mSePlayer.play(mSound[1], 1.0f, 1.0f, 0, 0, 1.0f);
}
});
}
}
参考:Android Developers:SoundPool

No comments:
Post a Comment