メモリから再生できるのは wav のみだと非常にキツイ。
midi などを再生したい場合 MediaPlayer でメモリにあるデータをファイルに
変換してから再生するのが良い。
さてファイルに落とし込む際、どのディレクトリを利用するか迷います。
そんな時は、Activity を継承したクラス内のメソッド、
Context.getCacheDir() を使うとキャッシュディレクトリのパスが簡単にGETできます。 このキャッシュはアプリケーション毎に異なるようで、エミュレーターでは 以下のパスになります。 /data/data/[package]/cache |
で…サウンドを制御するプログラムを色々試してるのですが、
stop() って使えなくね?
もちろん再生を停止する事は出来る。が 再利用することが、
仕様通りにできない。
MediaPlayer の仕様。
仕様では、STOP した場合 prepare() 又は prepareAsync() をコールした後に
start() する必要がある。
new -> setDataSource -> prepare -> start -> stop -> prepare -> start
しかし仕様通り prepare() を行うと、
java.io.IOException: Prepare failed.: status=0xFFFFFFFD |
が発生するんだね。ちなみに prepareAsync() でも一緒。
じゃあ prepare() を呼ばないとどうなるか? 答えは例外の種類が変わるだけ。
start called in state 0 error (-38, 0) Error (-38,0) |
Google さん…どうなってるの?
結局 reset() しないとダメなの?そうなると setDataSource() でもう一度
リソース設定しないとダメじゃないか。
再生 → 停止 → 再生 を頻繁に繰り返す系のゲームでは無駄が多すぎ。
ただでさえ一度ファイルに落とし込んでるのに。
本現象が、エミュ限定なのかどうかはわかりません。
結論的には、
再生 ->停止 ->再生 を行う場合は stop() では無く pause() メソッドを
使うのが良い。
iアプリや MIDP から移植する人は stop() ではなく pause() がベスト。
サウンドに関連して以下続きます。
サウンドをループ再生するために、onCompletion() をオーバライドします。
このメソッドは再生が完了したときに呼ばれるので、
public final static int STATE_PREPARE = 0;
public final static int STATE_PLAY = 1;
public final static int STATE_STOP = 2;
public final static int STATE_PAUSE = 3;
public void onCompletion( MediaPlayer mp ){
if( m_state == STATE_PLAY ){
mp.seekTo(0);
mp.start();
}else{
mp.setOnCompletionListener(null);
m_state = STATE_PAUSE;
}
}
上記のようにすることで永遠と再生する事ができます。
また onPause() で一時停止させ、onResume() で再開させてやれば iアプリと
同じサウンド環境を再現できます。
0 コメント:
コメントを投稿