Не удается перезапустить прерванную очередь аудиовхода в фоновом режиме на iOS - PullRequest
8 голосов
/ 14 февраля 2012

Я пишу приложение для iOS, используя AudioQueue для записи. Я создаю входную очередь, настроенную для получения линейного 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 .

Я не смог найти документацию для этого сообщения об ошибке, и, если возможно, перезапустить входную аудио-очередь в фоновом режиме.

Ответы [ 3 ]

8 голосов
/ 22 марта 2012

Да, это возможно, но для повторной активации сеанса в фоновом режиме аудиосеанс должен либо установить AudioSessionProperty kAudioSessionProperty_OverrideCategoryMixWithOthers

OSStatus propertySetError = 0;
    UInt32 allowMixing = true;



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

или приложение должно получать события команд пульта ДУ :

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
0 голосов
/ 15 февраля 2012

В настоящее время нет способа реактивировать, если вы находитесь в фоновом режиме.

0 голосов
/ 15 февраля 2012

Сделали ли вы поддержку вашего приложения в фоновом режиме info.plist?Я не уверен, что запись возможна в фоновом режиме, но вам, вероятно, нужно добавить «Обязательные режимы фона», а затем значение в этом массиве «Приложение воспроизводит аудио»

Обновить Я только что проверил и запись в фоновом режиме возможна.

...