8

録音用に AudioQueue を使用して iOS アプリを作成しています。リニア PCM を取得するように構成された入力キューを作成し、このキューを指定すると、すべてが期待どおりに機能します。

割り込みを管理するために、AVAudioSession のデリゲート メソッドを実装して、割り込みの開始と終了をキャッチしました。メソッド endInterruption は次のようになります。

- (void)endInterruptionWithFlags:(NSUInteger)flags;
{
    if (flags == AVAudioSessionInterruptionFlags_ShouldResume && audioQueue != 0) {

        NSLog(@"Current audio session - category: '%@' mode: '%@'",
              [[AVAudioSession sharedInstance] category],
              [[AVAudioSession sharedInstance] mode]);

        NSError *error = nil;
        OSStatus errorStatus;
        if ((errorStatus = AudioSessionSetActive(true)) != noErr) {
            error = [self errorForAudioSessionServiceWithOSStatus:errorStatus];
            NSLog(@"Could not reactivate the audio session: %@",
                  [error localizedDescription]);
        } else {
            if ((errorStatus = AudioQueueStart(audioQueue, NULL)) != noErr) {
                error = [self errorForAudioQueueServiceWithOSStatus:errorStatus];
                NSLog(@"Could not restart the audio queue: %@",
                      [error localizedDescription]);
            }
        }
    }
    // ...
}

フォアグラウンドでアプリが中断された場合、すべて正常に動作します。中断がバックグラウンドで発生した場合、問題が発生します。オーディオ セッションをアクティブにすると、エラー!catが発生します。

指定されたオーディオ セッション カテゴリは、試行されたオーディオ操作に使用できません。たとえば、オーディオ セッション カテゴリを kAudioSessionCategory_AudioProcessing に設定して、オーディオを再生または録音しようとしました。

セッションをアクティブ化せずにキューを開始すると、エラー コード-12985が発生します。

その時点で、カテゴリはAVAudioSessionCategoryPlayAndRecordに設定され、モードはAVAudioSessionModeDefaultになります。

このエラー メッセージに関するドキュメントも、バックグラウンドで入力オーディオ キューを再起動できるかどうかもわかりませんでした。

4

3 に答える 3

8

はい、可能ですが、バックグラウンドでセッションを再アクティブ化するには、オーディオ セッションで AudioSessionProperty kAudioSessionProperty_OverrideCategoryMixWithOthersを設定する必要があります。

OSStatus propertySetError = 0;
    UInt32 allowMixing = true;



    propertySetError = AudioSessionSetProperty (
                                                kAudioSessionProperty_OverrideCategoryMixWithOthers,
                                                sizeof (allowMixing),
                                                &allowMixing
                                                );

または、アプリがリモート コントロール コマンド イベントを受信する必要があります。

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
于 2012-03-22T12:15:18.713 に答える
0

現時点では、バックグラウンドにいる場合に再アクティブ化する方法はありません。

于 2012-02-15T00:48:18.753 に答える