Android でサウンドを再生するには、色々なやり方があるみたいだよ。
調べた方法は、以下の4つ。
AudioTrack クラス MediaPlayer クラス JetPlayer クラス SoundPool クラス
特徴なんかをちょっと整理しておこう。
AudioTrack クラス
データ配列をハードウェアに送り、直にPCMを鳴らすっぽい。
プログラム的に音を作り出すような用途で、お手軽にはいきそうもないね。
MediaPlayer クラス
一般的なサウンド・フォーマットを再生できる。
ざっと見たところ、mp3, ogg, MIDI, wav…と、メジャーなフォーマットに対応してるみたい。
ローカルのファイル再生だけでなく、ネットストリーミングにも対応してる。
ループ再生も可能。
同時に使用できるトラックは、4つまでみたい。
なので、シューティング・ゲームのような、SEをバカスカ使うようにはできてない。
ゲームならBGM向けって感じ。
JetPlayer クラス
Jetフォーマットのサウンドを扱えるものらしい。
ゲーム用途に…ということらしいけど、深くは調べていない。
ざっと見たところ、MIDIみたいな感じだろうかね。
複数のサウンド・データをひとまとめにして、複数トラックを扱える…のかな?
一般的なフォーマットじゃないので、製作中のスクリプト・エンジンには向かない。
SoundPool クラス
MediaPlayer と同じく、一般的なサウンド・フォーマットを再生できる。
同時に使用できるトラックは、256までみたい。
ループ再生も可能。
MediaPlayer とちがって、読み込み時にPCMデータへデコードする。
そのため、再生キューの反応がいい。
SE向きだね。
ただし、デコード完了を調べることができないらしい。
未完了の時に再生キューをだしても、再生されない。
OS 2.2以降なら調べられるみたいだけど、それ以前はできないみたいだ。
それと、デコードしたデータは、ネイティブ・ヒープに溜められてしまう。
データが大きくなると、Android全体を重くしてしまうんだ。
だから、BGMなどの長いデータには向かない。
要注意だね。
ゲーム用途なら…
ゲーム用途なら、以下のような使い分けかな。
MediaPlayer … BGM SoundPool … SE
アドベンチャー・ゲームなんかのVoice、いわゆる台詞音声はちと考えもの。
即応性からするとSEがいいんだけど…それだとヒープを圧迫することになる。
MediaPlayer で再生するのがいいだろうね。
ただ、ちょっとやってみたところ、複数トラックにするとノイズが出るんだよね…。
エミュレータのせいだと思うけど。
注意点
端末がXperia だと、SoundPool で色々と問題が発生するらしい。
原因はサウンド・ファイルのフォーマットにあるらしく、oggだと問題はないみたい。
特にこだわりがなければ、oggを標準フォーマットにするのがベストだね。