いま作ってるアプリで必要なので調査しました。
カードリーダーを使うアプリを作っています。
UniMag II, Two-Track Mobile MagStripe Reader この、流行のヘッドフォンジャックに刺して使用するものです。これを使うと、ヘッドフォンの音声からカードリーダの回路に電源を供給して、カードを読む事が出来ます。しかし,ヘッドフォンが刺さっていると、標準出力がヘッドフォンになるので、音が鳴らせなくなります。
手順
しかし、AudioToolboxを使用すると、出力先を強制的に変更する事が出来る様になります。以下のような手順と、コードです。
- オーディオセッションのカテゴリを、kAudioSessionCategory_PlayAndRecordに設定
- kAudioSessionProperty_OverrideAudioRoute を、 kAudioSessionOverrideAudioRoute_Speaker に設定する。
- ヘッドフォン側からの再生に戻したいた時に、kAudioSessionProperty_OverrideAudioRoute を、 kAudioSessionOverrideAudioRoute_None に設定する。
このモードに設定しないと、強制的にスピーカーからの出力を行えないようです。
AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; // 1
AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory, // 2
sizeof (sessionCategory), // 3
&sessionCategory // 4
);
UInt32 ASRoute = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (
kAudioSessionProperty_OverrideAudioRoute,
sizeof (ASRoute),
&ASRoute
);
AudioSessionSetActive(YES);
サンプルコードをgitHubに置いています。
tomohisa/selectPlayHeadsetSpeaker – GitHub
Audio関係も、かなりいろいろ触れそうで、やってみると楽しいですね。
この本にいろいろ書かれていそうですね。読んでみたい。
参考にしたページ:
AVAudioSession reroutes iPhone audio automatically? – Stack Overflow
AVaudioPlayerで音を鳴らす – 酢ろぐ
iPhoneアプリ開発: 同時に録音再生するアプリで、オーディオ出力をiPhone端末下部のスピーカに切り替える | 情熱とスキルと市場
オーディオセッションプログラミングガ
イド – Apple CoreAudio
My Codex Leicester » Blog Archive » iPhone Core Audio Programming 第4回 Audio Sessionその1 – Mac/iOS の Audio Visual Programmingの話題