iPhoneのアプリでオーディオを再生・録音する場合に、iPodの音楽を鳴らしたままミックスして出したり、ロックした時にも音を出せるようにするには、AudioSessionSetProperty関数を使ってAudioCategoryというのを設定します。
AudioSessionSetPropertyはこんな感じで宣言されています。
extern OSStatus AudioSessionSetProperty(AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData)
AudioSessionSetPropertyの第一引数にはAudioSessionPropertyID、第二引数はプロパティのサイズ、第三引数には設定する値をポインタで渡します。CoreAudioではおなじみの構成です。
AudioSessionSetPropertyは色々とオーディオ関係の設定できますが、とりあえず今回はAudioCategoryの設定だけをやってみます。前回のコードのsetupAudioSessionメソッドを以下のように書き換えてください。
- (void)setupAudioSession { AudioSessionInitialize(NULL, NULL, InterruptionListener, &outputUnit); UInt32 category = kAudioSessionCategory_AmbientSound; AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category); AudioSessionSetActive(true); }
AudioCategoryのプロパティの型はUInt32と決まっていますので、その変数を作ってポインタで渡すという感じになります。プロパティの型の種類はものによってバラバラですが、ヘッダを辿るとコメントに書いてあります。
これで実行すると、iPodの音楽を鳴らした状態でアプリを起動しても音楽が止まらず、サイン波がミックスして再生されると思います。
プロパティのkAudioSessionCategory_AmbientSoundの部分をkAudioSessionCategory_MediaPlaybackに変えてみてアプリを実行すると、iPodの音楽はフェードアウトしてしまいますが、ロックしてスリープするときにサイン波は鳴りっぱなしになります(でも、このコードではピッチは下がってしまいますが)。
カテゴリの動作一覧はAudioSession Programing Guide内にありまして、日本語に置き換えてみるとこんな感じでしょうか。
PropertyID | サイレントスイッチの効果(およびスクリーンロック時の消音) | 他アプリのオーディオ再生 | 使用例 |
---|---|---|---|
AmbientSound | ある | する | ゲーム効果音やバーチャル楽器など。iPodの音楽を再生しながら鳴らすもの |
SoloAmbientSound | ある | しない | デフォルト。ゲームサウンドなど。他アプリの音を再生しないもの |
MediaPlayback | ない | しない | オーディオファイル再生 |
LiveAudio | ない | しない | ライブパフォーマンス系。バーチャル楽器など |
RecordAudio | ない | しない | 録音のみ |
PlayAndRecord | ない | しない | 再生と録音 |
何もカテゴリーを設定しないとSoloAmbientSoundになってしまいます。それと残念ながら、iPodの音楽を鳴らしながらスクリーンロック中に音を出すってことは出来ないみたいです。
※2009/10/7追記
OS3.0以降、MediaPlaybackなどのカテゴリでも、kAudioSessionProperty_OverrideCategoryMixWithOthersを使う事でiPodの音楽を流しながら音を出す事が出来るようになっています。また、LiveAudioとUserInterfaceSoundEffectsはDeprecatedになってます。
また、ちょっと分からない部分なんですが、RecordAudioにしていたからといって再生が出来なくなるという訳ではなかったりするので、結局のところAudioCategoryの設定は3パターンしかないようです。もし今の段階で違いが無かったとしても、今後のOSのバージョンアップで何か変化があるかもしれませんけど。
※追記 2009/1/25
AudioCategoryの種類によってルートチェンジのときに違いがあるみたいですね。それはまたちゃんと調べたらルートチェンジで1つエントリを書きます。
といったところでAudioCategoryはこの辺で。次回は、ずっと悩まされ続けてきたIOバッファあたりについて書いてみようかと思います。
I’ve a question about iphone audio, i think you can help me.
Can you send me an email?
Sorry, I am not good at english.You must question with Apple discussions if there is a question about iPhone audio.