June 9, 2012

SoundPoolで効果音を再生する

SoundPoolを使った効果音の再生方法です。

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