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 件のコメント:

コメントを投稿