Я пишу приложение для 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 .
Мне не удалось найти ни документации для этого сообщения об ошибке, ни возможности перезапустить очередь входящего аудио в фоновом режиме.