8月は花火大会、夏祭り、私のバースデーと目白押しな一ヶ月
そんな熱中症予備軍・大量光合成中のUTOです。
今回はAVAudioPlayerを使ったサウンド再生において
ちょいと特殊な手法をまとめてみました。
スポンサーサイト
やっと iPhone SDK での開発になれてきた折に
次期メジャーバージョン 3.0 が間もなく公式発表される
ということで、個人的には少し複雑な心境の Tasaki です。
せめて1本目を先にリリースしたい…
今回は、iPhone でサウンドを使用する場合に
知っておきたいオーディオセッションの初期化に関する話を
しようと思います。
iPhone OS 2.2 から、AVFoundation という
新たなフレームワークが追加されたわけですが、
これを使うことで、Audio Queue Services や OpenAL などの
低水準フレームワークを使わずに音声ファイルの再生を
行えるようになりました。
それまでは、機能が著しく限定された System Sound Services だけが
他のアプローチに比べて断然簡単に実装することができたわけですが、
AVFoundation の追加によって Objective-C ベースでの
サウンドファイルの制御が可能になったのはうれしいかぎりです。
(そもそも Audio Queue Services は、いまだによく分かっていません)
ただ、AVAudioFoundation フレームワークの
AVAudioPlayer クラスを利用する場合は
オーディオセッションの初期化などが不要なので
敷居が低い代わりに、このオーディオセッションへの
理解が必ずしも伴わなくなるという側面があります。
(僕がそのうちの1人だったわけですが)
そもそもオーディオセッションとは、
アプリケーションにおけるサウンド再生のふるまいを定義するものです。
これを正しく設定することで
iPod で再生中の楽曲とアプリケーション独自のサウンドを
ミックスしたり、スリープ後もサウンドの再生を続行するなどの
効果が現れます。
上記の効果を得るための手順は簡単です。
①オーディオセッションを初期化する。
②オーディオセッションカテゴリを設定する。
③AVAudioPlayer オブジェクトを初期化する。
まず、オーディオセッションの初期化についてですが、
その前に AudioToolBox フレームワークをインポートしておきます。
その後初期化関数を呼び出します。
Audio Queue Services などを使用する場合に比べて
初期化のための引数は超単純です。
以下にコード例を示します。
#import <AudioToolbox.h>
...
AudioSessionInitialize( NULL, NULL, NULL, NULL );
…まさか、これで動くとは思いませんでした。
次にオーディオセッションカテゴリを設定します。
オーディオセッションカテゴリは、幾つかあり
それらは定数で定義されています。
例えば、iPod で再生中の楽曲とアプリケーションの効果音を
ミックスしたいという場合には、
UserInterfaceSoundEffects カテゴリが適しています。
以下のコードでオーディオセッションカテゴリを変更することができます。
UInt32 category = kAudioSessionCategory_UserInterfaceSoundEffects;
AudioSessionSetProperty( kAudioSessionProperty_AudioCategory, sizeof( category ), &category );
あとは、AVAudioPlayer オブジェクトを
いつものように初期化すればいいだけです。
特にアプリケーションで BGM を使用しない場合には、
このカテゴリに設定しておくと
ユーザーにより自由なプレイスタイルを提供できます。
音楽は要らないと思えば、自分で iPod の再生を止めればいい
だけですからね。
AVAudioPlayer は簡単なのがいいですね。
…本当は、Audio Queue Services とか OpenAL とか
触ってみたいとは思うんですがねー。