¿Cuándo y cómo desactivar correctamente su session de audio?

¡Estoy un poco perdido con AVFoundation y eres mi última esperanza!

Estoy escribiendo una aplicación de entrenamiento en la que a veces reproduzco indicaciones cortas, por ejemplo: "pedaleas durante 10 minutos" o "¡bien!"

Apple recomienda activar la session de audio justo antes de reproducir el post y desactivarlo siempre después de reproducir el post. Más que una recomendación, esto es realmente lo que quiero, porque utilizo la opción: AVAudioSessionCategoryOptionDuckOthers y solo quiero agachar el reproductor de música mientras se reproduce el post, no antes, ni después.

¡No sé cómo lograr eso! Debido a que no estoy muy seguro de la manera de desactivar la session de audio, mi primera idea fue usar un "time".

Aquí está mi class AudioController:

#import "AudioController.h" @interface AudioController () @property(strong,nonatomic)AVAudioPlayer *audioPlayerGood; @end @implementation AudioController -(id)init { self=[super init]; if (self) { [self configureAudioSession]; [self preparePlayers]; } return self; } -(void)configureAudioSession { self.audioSession = [AVAudioSession shanetworkingInstance]; NSError *setCategoryError = nil; [self.audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDuckOthers error:&setCategoryError]; } -(void)preparePlayers { NSError *initAudioPlayerError = nil; NSURL *urlGood = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Correct" ofType:@"caf"]]; self.audioPlayerGood = [[AVAudioPlayer alloc] initWithContentsOfURL:urlGood error:&initAudioPlayerError]; if (initAudioPlayerError) { NSLog(@"Error in audioPlayer: %@",[initAudioPlayerError localizedDescription]); } [self.audioPlayerGood prepareToPlay]; } -(void)playCorrect { NSError *activationError = nil; [self.audioSession setActive:YES error:&activationError]; [self.audioPlayerGood play]; NSLog(@"****************Correct played***************"); while (self.audioPlayerGood.playing) { break; } [self.audioSession setActive:NO error:&activationError]; } @end 

Luego inicializo un object AudioController en otra class en la que uso el método playCorrect:

 [self.audioController playCorrect]; 

Pero justo después de reproducir el sonido, el área de debugging me imprime este text:

AVAudioSession.mm:646: – [AVAudioSession setActive: withOptions: error:]: Desactivar una session de audio que tiene E / S en ejecución. Todas las E / S deben detenerse o detenerse antes de desactivar la session de audio.

Y si diez segundos después quiero reproducir este sonido de nuevo, no funcionará, mientras que el método playCorrect debería reactivar la session de audio … Por lo tanto, no sé cuál es la forma correcta de desactivar la session de audio y cuándo hacerlo, si alguien podría ayudarme en esto 🙂

¿Qué se supone que debe hacer ese ciclo?

Será mejor que escuches que el jugador termine de jugar y luego desactives la session.

 [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finishedPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem]; 

Al descartar ViewController , debe pausar / liberar la audioSession . Hay un método de pause de audioSession