2009-03-23 13 views
6

Je développe un streamer audio et ai déclaré un écouteur d'interruption pour sauvegarder l'état d'un morceau lorsqu'une interruption se produit - comme un appel entrant ou un sms.Gestion des interruptions avec la file d'attente audio

Voici le code correspondant

Dans mon AppDelegate, j'ai cette

AudioSessionInitialize (NULL, NULL, interruptionListenerCallback, self); 
AudioSessionSetActive(YES); 

C'est ce que l'auditeur d'interruption ressemble

void interruptionListenerCallback (void *inUserData, UInt32 interruptionState) { 
// This callback, being outside the implementation block, needs a reference 
//to the AudioPlayer object 
MyPlayer *player = (MyPlayer *)inUserData; 

if (interruptionState == kAudioSessionBeginInterruption) { 
    if ([player audioStreamer]) { 
     // if currently playing, pause 
     [player pausePlayback]; 
     player.interruptedOnPlayback = YES; 
    } 

} else if ((interruptionState == kAudioSessionEndInterruption) && player.interruptedOnPlayback) { 
    // if the interruption was removed, and the app had been playing, resume playback 
    [player resumePlayback]; 
    player.interruptedOnPlayback = NO; 
} 

}

Quand je reçois un appel téléphonique l'auditeur d'interruption est appelé et si l'utilisateur refuse l'appel le La méthode de reprise de lecture est également appelée. Mais avant que la méthode resumePlayback est appelée, je reçois cette erreur de la console pour AudioQueueEnqueueBuffer

error: tca! error int: 560030580

Est-ce que quelqu'un a une idée de la façon de gérer correctement les interruptions audio lorsque des fichiers audio en continu.

Merci.

Répondre

0

Il me semble que vous définissez inUserData comme appDelegate au lieu de votre lecteur.

2

! Acte est kAudioSessionNotActiveError, a déclaré dans AudioServices.h, avec le commentaire

« L'opération a échoué car le AudioSession n'est pas actif. L'appel AudioSessionSetActive (true) premier va corriger cette erreur dans la plupart des cas. »

Vous obtenez également cette erreur lorsque vous appelez AudioQueueStart() après une interruption (comme je l'ai découvert aujourd'hui).

+0

Dans mon cas, c'était parce que j'ai arrêté la session avant de mettre en pause un AVPlayer en cours de lecture. – Drew