オーディオキューサービスを使用して、iPhone /iPodTouchで着信オーディオを分析しています。アナライザーの望ましい動作は、次のように要約されます。アプリがアクティブになったら、分析を開始します。アプリがバックグラウンドに送信されたら、分析を停止します。
私は単純なアプローチを使用しており、AppDelegateを使用して、アプリの状態が変化するたびにアナライザーを開始および停止します。
ここにいくつかのコードがあります:
- (void)applicationWillResignActive:(UIApplication *)application {
AudioQueueFlush(_aqRef);
AudioQueueStop(_aqRef, true);
AudioQueueDispose(_aqRef, true);
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
AudioQueueNewInput(&_formatDescription, _renderCallback, NULL, NULL, NULL, 0, &_aqRef);
AudioQueueAllocateBuffer(_aqRef, _aqBufferSize, &_aqBufferRef);
AudioQueueEnqueueBuffer(_aqRef, _aqBufferRef, 0, NULL);
AudioQueueStart(_aqRef, NULL);
}
すべての変数が初期化され、機能しています–与えられ、テストされたとおりにそれを取ります。キューとバッファを毎回破棄して割り当てる必要はありませんが、今のところ違いはなく、この方法でより完全になります。
これが何が起こるかです:
ステップ1)アプリを起動すると、オーディオキューが開始されます。ボブは、おじさんです。
ステップ2)電源ボタンを押すと、アプリが一時停止します。ただし、オーディオキューがシステムの音をブロックしているように見えるため、ロック音は聞こえません。ただし、ほとんどの場合、アプリの最初の起動後に表示されることがありますが、それは信頼できません。最初のグリッチ。
手順3)ホームボタンを押して、電話のロックを解除します。繰り返しになりますが、オーディオキューがすでに引き継がれているため、電話のロックを解除するシステムサウンドは聞こえません。ただし、ロック解除音が少し聞こえる場合があります。時々。どちらも信頼できません。2番目のグリッチ。
ステップ4)ホームボタンを押して、アプリをバックグラウンドに送信します。アプリが消えてから約1秒後、システムはステップ3でロック解除サウンドを再生できなかったことを認識し、今すぐ再生します。フルボリュームで。それは本当に悪いです。
これは私に2つの質問につながります:
質問1):電源ボタンを押すと、applicationWillResignActive:よりも早くオーディオキューを停止する方法が他にありません。ここで足りないものはありますか?私はロッキングサウンドが欠落していても大丈夫ですが、それを確実に鳴らす(または鳴らさない)ための他の方法について学ぶことができてうれしいです。
質問2):ステップ4のロック解除音の遅延は、私に頭痛の種を与えています。これを防ぐ簡単な方法は、オーディオキューの開始を遅らせて、ロック解除サウンドを妨げられずに再生できるようにすることです。しかし、それはハックのように思えます。誰かが私をより良い方向に向けることができれば、私ははるかに幸せなコーダーになるでしょう。
ありがとう/Andreas