Impossible de redémarrer une queue d'input audio interrompue en mode arrière-plan sur iOS

J'écris une application iOS en utilisant un AudioQueue pour l'logging. Je crée une file d'input configurée pour get PCM linéaire, a déclaré cette queue et tout fonctionne comme prévu.

Pour gérer les interruptions, j'ai implémenté les methods déléguées de AVAudioSession pour capturer le début et la fin d'une interruption. La méthode endInterruption ressemble à ceci:

- (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]); } } } // ... } 

Si l'application est interrompue alors qu'elle est au premier plan, tout fonctionne correctement. Le problème apparaît, si l'interruption se produit en arrière-plan. L'activation de la session audio entraîne l'erreur ! Cat :

La catégorie de session audio spécifiée ne peut pas être utilisée pour l'opération audio tentée. Par exemple, vous avez tenté de lire ou d'save de l'audio avec la catégorie de session audio définie sur kAudioSessionCategory_AudioProcessing.

Le démarrage de la queue sans l'activation des résultats de la session dans le code d'erreur: -12985

À ce stade, la catégorie est définie sur AVAudioSessionCategoryPlayAndRecord et le mode est AVAudioSessionModeDefault .

Je n'ai trouvé aucune documentation pour ce message d'erreur, ni s'il est possible de redémarrer une queue audio d'input en arrière-plan.

À l'heure actuelle, il n'y a aucun moyen de réactiver si vous êtes en arrière-plan.

Oui, c'est possible, mais pour réactiver la session en arrière-plan, la session audio doit soit définir AudioSessionProperty kAudioSessionProperty_OverrideCategoryMixWithOthers

 OSStatus propertySetError = 0; UInt32 allowMixing = true; propertySetError = AudioSessionSetProperty ( kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (allowMixing), &allowMixing ); 

ou l'application doit recevoir des events de command de contrôle à distance :

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

Avez-vous fait en sorte que votre application prenne en charge l'arrière-plan dans info.plist? Je ne suis pas sûr si l'logging est possible en arrière-plan, mais vous devez probablement append "Required Background Modes" puis une valeur dans ce tableau de "App joue audio"

Mise à jour Je viens de vérifier et d'save en arrière-plan est possible.