SE再生を想定して、SoundPool でサウンド・ファイルを再生してみたよ。
作ってみたのは、下記ソース。(Android1.6 ベース)
public class mySound extends Activity { private SoundPool sp; int seID = -1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //リソースファイルからSE sp = new SoundPool( 5, AudioManager.STREAM_MUSIC, 0 ); seID = sp.load( this, R.raw.voice, 1 ); // Button01 Button but_PlaySE = (Button) this.findViewById( R.id.Button01 ); but_PlaySE.setText( "PlaySE 0" ); but_PlaySE.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { sp.play( seID, 1.0F, 1.0F, 0, 0, 1.0F); } }); //--------------- } @Override public void onDestroy(){ sp.stop( seID ); sp.unload( seID ); sp.release(); super.onDestroy(); // アクティビティの終了 finish(); } }
- layout のmain.xml にbutton をひとつ設け、ボタンを押されるとサウンドが再生されるようにしている。
- ボタンを押されるたびにサウンドが再生され、これは多重再生になる。
- 再生するファイルは、リソース・ファイル。
サウンド・ファイルは、res の中に raw というディレクトリを作って、その中に格納する。 - ファイル・フォーマットは、ogg。
Android-x86 の仕様なのか、mp3 は再生できなかった。
オブジェクトの生成
sp = new SoundPool( 5, AudioManager.STREAM_MUSIC, 0 );
再生チャンネルを、5つ。
クオリティを、0 で設定。
※. 今回のソースでは、1つの音しか再生しないけど、とりあえずで5つで設定してみた。
load
seID = sp.load( this, R.raw.voice, 1 );
最後の引数・1 は、priority。
他のチャンネルとの音量バランスみたいなものかね?
load 時にチャンネルID が返されるので、これを保持しておく。
再生キューは、このID を引数にして実行するんだ。
なので、複数チャンネル設ける時は、配列なんかで保持することになるね。
今回のソースはAndroid1.6 ベースなので、load 完了を調べることができない。
load が完了しないと音が再生されないから、ちと困りもの…。
アプリに実装する場合は注意しないといけないね。
play
sp.play( seID, 1.0F, 1.0F, 0, 0, 1.0F);
引数はそれぞれ、以下のようになっている。
sooundID : loadした時の返り値 leftVolume : 左スピーカーの音量。 rightVolume : 右スピーカーの音量。 priority : プライオリティ( 0が一番優先度が高い ) loop : ループ回数( -1 = 無限ループ。0 = ループなし ) rate : 再生速度( 0.5~2倍速まで設定可能 )
素で鳴らすだけじゃなく、いろいろできそうだ。
onDestroy
再生停止だけじゃなく、メモリー解放なんかもしている。
”試してみた” 程度のものなんで、不必要なこともやってるかも。(^_^;
setOnLoadCompleteListener
Android2.2 以降では、setOnLoadCompleteListener でload 完了を通知できるようになっている。
通知を受け取ったら、フラグを立てる構造にするのがベスト。
by te way…
SoundPool でサウンド再生できるようになったけど…。
load 時にオーバーフローを起こしてるみたいだ。
ログにエラーがズラズラ吐き出されている。
そう大きなデータではないし、再生にも影響ないようなんだけど、気になる…。
VirtualBox か、Android-x86 特有の現象なのかな…?