Reprendre l'audio d'arrière-plan après la mise en pause de AVAudioPlayer

J'ai développé une application iPhone qui permet à d'autres applications de lire l'audio en arrière-plan. Pour ce faire, j'initialise ma session audio comme ceci:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

À un certain moment dans mon application, je fournis un lecteur audio pour lire certains files stockés dans CoreData avec AVAudioPlayer. Lorsque l'user appuie sur le button de lecture, l'audio d'arrière-plan doit être mis en pause. Lorsque le lecteur a terminé ou est en pause, l'audio en arrière-plan devrait reprendre la lecture.

En reprenant après la lecture du lecteur avec

 -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil]; } 

fonctionne comme un charme, je suis coincé avec reprendre après une pause. Il devrait fonctionner de la même manière dans IBAction du button

 -(IBAction)pausePlayer { if (self.player.isPlaying) { [self.player pause]; [[AVAudioSession sharedInstance] setActive:NO withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil]; } } 

mais j'ai toujours la même erreur:

 Unable to deactivate audio session. Error: Error Domain=NSOSStatusErrorDomain Code=560030580 "The operation couldn't be completed. (OSStatus error 560030580.)" 

Des suggestions pour lesquelles il est impossible d'inactiver l'AudioSession dans ce cas?

J'ai essayé pendant 3 heures enfin l'ai obtenu ici est ce que j'ai fait

 #import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewController () @property(strong, nonatomic)AVAudioPlayer *player; @property(strong)AVAudioSession *session; @end @implementation ViewController - (IBAction)playsound:(id)sender { NSURL *url=[[NSURL alloc]initWithSsortingng:[[NSBundle mainBundle] pathForResource:@"sound" ofType:@"mp3"]]; NSError *err; self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&err]; [self.player setDelegate:self]; [self.player setVolume:2.5]; self.session=[AVAudioSession sharedInstance]; [self.player prepareToPlay]; [self.player play]; } - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { NSError *err; [self.session setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&err]; } @end 

Il semble que la désactivation est trop tôt. Selon la reference de class AVAudioSession "La désactivation de votre session échouera si des objects audio associés (tels que des files d'attente, des convertisseurs, des lecteurs ou des enregistreurs) sont en cours d'exécution."

Il semble y avoir quelques solutions:

  1. exécutez la désactivation dans une boucle jusqu'à ce qu'il réussisse.

    Ceci est préconisé dans http://iknowsomething.com/ios-sdk-spritekit-sound/

  2. reporter la désactivation, par exemple jusqu'à ce que ce soit vraiment nécessaire.

  3. lorsque vous utilisez par exemple le service de mise en queue audio, vous pouvez envisager d'arrêter immédiatement. (pas testé)

    Dans une application d'logging avec la possibilité d'écouter les loggings, je ne les désactive que juste avant de changer de catégorie en utilisant la séquence: activer NO, setCategory et activer YES.

    Voir par exemple «Pendant que votre application est en cours d'exécution, Apple vous recommand de désactiver votre session audio avant de modifier l'une des valeurs définies» dans le Guide de programmation de sessions audio d'Apple.