過去の投稿記事 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() をオーバライドします。
このメソッドは再生が完了したときに呼ばれるので、
  1. public final static int STATE_PREPARE = 0;  
  2. public final static int STATE_PLAY    = 1;  
  3. public final static int STATE_STOP    = 2;  
  4. public final static int STATE_PAUSE   = 3;  
  5.   
  6. public void onCompletion( MediaPlayer mp ){  
  7.    
  8.  if( m_state == STATE_PLAY ){  
  9.   mp.seekTo(0);  
  10.   mp.start();  
  11.  }else{  
  12.   mp.setOnCompletionListener(null);  
  13.   m_state = STATE_PAUSE;  
  14.  }  
  15. }  
 
上記のようにすることで永遠と再生する事ができます。
 
また onPause() で一時停止させ、onResume() で再開させてやれば iアプリと
同じサウンド環境を再現できます。

0 コメント:

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