過去の投稿記事 new!
・【画像】漫画でわかる外国人参政権
・東京電力のHPで停電状態が確認できたり(サービス再開!)
・戦国時代 ~ 江戸時代の徳川家康が熱かった
・vaio のバッテリは寿命が短いような気がする
・話題の Western Digital 製 WD20EARS を購入した
・C01LC をビックカメラで買ってきた
・2025年には空中都市が現実化?!
・【動画】わかりやすい「宇宙ひも理論」
・今世紀には「富士山噴火」「東海連動地震」「首都圏直下型地震」か?
・滅びた町、南浜町が Googleストリートビューで見れる

【 amazon 送料無料キャンペーン 】

バックリンクはご自由にどうぞ!     http://mfsocket.blogspot.com/feeds/posts/default?alt=rss リンク集 / ログイン

2011/01/21
Android サウンドの MediaPlayer.stop() の罠?

 
メモリから再生できるのは wav のみだと非常にキツイ。
 
midi などを再生したい場合 MediaPlayer でメモリにあるデータをファイルに
変換してから再生するのが良い。
 
さてファイルに落とし込む際、どのディレクトリを利用するか迷います。
 
 
そんな時は、Activity を継承したクラス内のメソッド、
 
Context.getCacheDir()
 
を使うとキャッシュディレクトリのパスが簡単にGETできます。
このキャッシュはアプリケーション毎に異なるようで、エミュレーターでは
以下のパスになります。

/data/data/[package]/cache
 
 
で…サウンドを制御するプログラムを色々試してるのですが、
 
stop() って使えなくね?
 
もちろん再生を停止する事は出来る。が 再利用することが、
 
仕様通りにできない。
 
 
MediaPlayer の仕様。
mediaplayer_state_diagram
 
仕様では、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 コメント:

  • コメントには <b>, <strong>, <em>, <i>, <a> など一部の HTML タグを使用できます。