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音響系とかでしょうか)の場合、ヘッドフォンがささってない場合にのみアラートを出す、といった使いかたもできそうです。


プロジェクトファイルのダウンロード