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