最近はAudio Unitをあれこれと触っていた事もあって、久々のプログラミングの話題はサウンド再生についてです。
iPhoneでサウンドを再生する方法はざっと5つあります。
1)SystemSound
2)AVAudioPlayer
3)AudioQueue
4)OpenAL
5)AudioUnit
それぞれの特徴について、ざっとまとめます。
1)SystemSoundについて
3秒程度の短いサウンドを再生するAPIで、時間が長いサウンドファイルは鳴らせません。
AudioSessionサービスで、セッション制御を行わなくても、端末のマナーモードのスイッチに応じて、音を再生/ミュートします。
2)AVAudioPlayerについて
iPhone OS 2.2で追加されたクラスです。
これが出てくるまでは、長いサウンドファイルはAudioQueueかOpenALで鳴らす必要がありましたが、このクラスを使えば簡単に再生する事ができます。
複数のサウンドファイルを、別々のボリュームで再生できるので、このクラスを使えば大体のニーズは満たせるのではないかと思います。
3)AudioQueueについて
再生だけでなく、マイクからのレコーディングも使えます。
コールバック内で、ファイルから読み込んだデータをバッファにセットするようなコードを自前で書く必要があるので、結構手間がかかります。
マイクからのレコーディングを行う必要がなく、再生のみであれば、AVAudioPlayerで十分だと思いますが、よりレイテンシの少ない再生を行いたいのであれば、OpenALかAudioUnitを使った方が良いようです。
4)OpenALについて
3Dで定位した音を再生できます。(内部的にはAudio Unitの3DMixerを使って再生しているようです。)
3Dの定位を必要としない場合でも、低レイテンシで音を再生したい場合は、OpenALを使った方が良いかも知れません。
3Dの定位を試せるAppleのサンプルコードもありますが、左右のパニングや、距離による音の減衰はいいとしても、前後や上下は今ひとつ違いが分からない気がします。
5)Audio Unitについて
一番ハードウェアに近い低レベルのAPIで、iPhoneでは以下のユニットを使う事ができます。
・3D Mixer unit
→OpenALでも使われている音を3Dに定位できるユニット
・Multichannel Mixer unit
→複数の音をミキシングするユニット
・Converter unit
→ファイルフォーマットの変換
・I/O unit
→音の再生とレコーディング
・iPod EQ unit
→iPodで使えるイコライザー
低レイテンシで色々と使える反面、自前で書くコードの量は多くなります。
remoteIO以外はサンプルソースも無く、組むのは大変ですが、3DMixer+remoteIOで音を鳴らした所、色々やりたい場合はこの組み合わせが良いような感触です。
レコーディング&再生については、Developer Forumに「Using a RemoteIO AudioUnit for low-latency recording」という投稿があるので、こちらが参考になると思います。
上記の鳴らし方以外に重要なこととしては、AudioSessionの管理があります。
AudioSessionや具体的なコードに関してはまた気が向いた時にでも。
そろそろiPhoneOS 3.0への対応などもやらないとですね。
※iPhoneアプリ開発に関する投稿を今から始めるiPhoneアプリ開発にまとめました。
最近のコメント