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

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

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

2011/02/21
Android の AudioTrack.write() は同期メソッド

 
Windows のゲーム開発では DirectSound を利用したり、簡単に波形データを
出力するのに waveOutWrite() 等を使い連続して再生出来るので、ラジオや、
擬似ストリーミングを提供するには wav 形式がベスト
 
 
さて Android で同じように wav で連続した音源を再生し続けたい場合は、
AudioTrack クラスを利用することができます。
 
 
しかしこのクラスの write() メソッドですが…
 
非同期ではなく、ブロッキングするようです
 
エミュと GalaxyTab で確認した。
 
 
簡単に言うなら、再生が完了するまで write() から抜けないんです。
 
「ガンガンバッファに書き込んでいこうぜ」ってことが 出来ない
 
再生が終わらないと、次の音源データをバッファに書き込めない。
 
 
この場合、別スレッドとしてプログラマが制御を行わなかったら、
 
write() -> 次の音源データ読み込み -> write()
  ↑                          ↑
  ブロックする          再生終わってからメモリに読み込むと、音源が切れる
 
と、連続再生として意味の無い結果を迎えてしまいます。
 
1ファイルの再生が終わる度に、ぷちぷちって感じですね。
 
 
回避手順としては上記の write() を別スレッド化し、元のスレッドではその間に
次の音源データを読み込む。
 
読み込んだ後 「write() を行う、自作バッファリスト」に押し込んでおく。
 
 
write() スレッドは自作バッファリストに次の音源があれば、バッファを取り出し、
即座に write() を行う
 
ちょっと手間だけど…スレッドを用いないと、連続再生がスムーズに行かないので
仕方ありません。
 
素直に、非同期版の AudioTrack.write() を用意して欲しい所。

0 コメント:

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