AudioSession API
* 実機でしか動きません。シミュレーターではエラーが出るはずです。ご注意ください。
ちょっとマニアックなAPI, AudioSession APIについてのサンプルプロジェクトを作ってみました。
iPhoneを使って最初に感動したのが、電話機能と他の機能のスムーズなインテグレーション。たとえば、iPod機能で音楽を聞いていて、電話がかかってくると、音楽がフェードアウトすると同時に着信音がフェードイン、電話が終わると今度は音楽がフェードインしてきてもとに戻る。といった具合です。同様にゲームを起動すると、iPod機能で再生中の音楽はフェードアウトするのに対して、音を使わないアプリ(MailやSafariなど)は音楽を再生しながら使うことができます。
こうしたアプリケーション間でサウンドの管理をしているのが、AudioSession APIです。各アプリケーションは、そのアプリケーションの用途と仕様(BGMを再生する、効果音のみなどなど)に応じた AudioSessionをスタートして、他のアプリからサウンドの使用権を得る、あるいは譲渡することになります。
このサンプルコードでやっていることは主に以下の三つ。
1. AudioSessionカテゴリーの設定
AudioSessionカテゴリーとしては、Sound Effect (効果音のあるアプリ)、Live Audio (例えばバーチャルピアノやギターのようなアプリ)、Record Audioなどがあり、それぞれ、iPod機能で再生中の音を止めるかどうか、マナーモードの設定を無視して音を出すかどうか、といった点でそれぞれに違いがあります。
iPodで音楽を再生しながら、このサンプルアプリを立ち上げ、カテゴリーを変えてみて、それぞれの動作の違いを確認するとよいかもしれません。
(ちなみに、UIPickerViewの簡単な使い方のデモとしても役に立つかもしれませんね)
2. AudioSessionPropertyListenerをつかってルーティングの変化をキャッチ
ここで言う、ルーティングの変化とは、たとえばヘッドフォンやヘッドセットがプラグインされたり、抜かれたりすることで、音の出力先、入力元が変化することです。
AudioSessionAddPropertyListener
でcallbackを登録しておくと、ルーティングがかわったときにcallbackが呼ばれるようになります。
3. AudioSessionGetPropertyで入出力情報の取得
上記のcallbackなどから(ほかから呼んでもよい)、AudioSessionGetPropertyを使うことで入出力の設定を確認することができます。取得できる情報としては、
- 入出力のチャンネル数
- サンプリングレート (44.1kと表示されるが、ADCの特性が悪いため実質は22kHz程度なのではないでしょうか)
- ルーティングの種類
など。詳しくはヘッダをチェックしてください。
「ルーティングの種類」は、現在の入出力の状態を端的に示した文字列として取得できる。AudioSessionCategoryによって違うようで、Ambient Sound, Media Playbackのような再生のためのCategoryでは、Headphone, Speaker, Headsetといった文字列が、またPlay and Recordのような録音が絡むCategoryでは、ReceiverAndMicrophone, HeadsetInOut, HeadphoneAndMicrophoneといった文字列が返ってくる。これをもとに「どうしてもヘッドホンで使ってほしい!」というようなアプリケーション(うーん、3D音響系とかでしょうか)の場合、ヘッドフォンがささってない場合にのみアラートを出す、といった使いかたもできそうです。