2012-02-14 3 views
7

Я пишу приложение iOS, используя AudioQueue для записи. Я создаю очередь ввода, настроенную для получения линейного PCM, заявила эту очередь, и все работает так, как ожидалось.Невозможно перезапустить прерыванную очередь ввода аудио в фоновом режиме на iOS

Чтобы управлять прерываниями, я реализовал методы делегата 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]); 
      } 
     } 
    } 
    // ... 
} 

Если приложение прерывается, пока он находится на переднем плане, все работает правильно. Проблема возникает, если прерывание происходит в фоновом режиме. Активация результата аудио сеанса в ошибке кошки:

Указанной категория аудио сессии не может быть использован для попытки аудио работы. Например, вы попытались воспроизвести или записать аудио с категорией аудиосеансов, установленной в kAudioSessionCategory_AudioProcessing.

Запуск очереди без активации результатов сеанса в коде ошибки: -12985

В этот момент категория устанавливается в AVAudioSessionCategoryPlayAndRecord и режим AVAudioSessionModeDefault.

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

ответ

0

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

+0

Я так и думал. :-( –

0

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

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

+0

Запись будет работать отлично в фоновом режиме. Проблема возникает, если прерывание аудио сеанса заканчивается в фоновом режиме. –

+0

Вы пытались использовать события дистанционного управления? Очевидно, пользователю придется нажать кнопку. ** [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; ** –

+0

У меня такая же проблема: когда запись прерывается, когда приложение находится в фоновом режиме, уведомление об «прекращении прерывания» в любое время не запускается в приложении. Поскольку приложение iTalk правильно управляет таким прерыванием, должно быть решение ... – Denis

7

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

OSStatus propertySetError = 0; 
    UInt32 allowMixing = true; 



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

или приложение должно receive remote control command events:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self becomeFirstResponder]; 
+0

Спасибо, я преследовал это несколько дней! Я бы +10, если бы мог :-) –