2009年5月
« 4月   6月 »
 123
45678910
11121314151617
18192021222324
25262728293031
2009/05/25

iPhoneで音を鳴らす

最近は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アプリ開発にまとめました。

 

Comments are closed.