12
votes

AvudiosessionDelegate a appelé à endinterrupter, mais débutant non appelé

Je crée une avaudiosité lorsque l'application lance et définit le délégué à l'Appdelegate. Tout semble fonctionner (lecture, etc.), sauf que le débutant sur le délégué n'est pas appelé lorsque le téléphone reçoit un appel. Lorsque l'appel met fin à la fin de l'appel est appelé cependant.

La seule pensée que j'ai est que le code de joueur audio que j'utilise est utilisé pour être basé sur Avaudioplayer, mais utilise maintenant Avplayer. Les rappels pour le délégué avaudioplayer pour la manipulation des interruptions sont encore là, mais il semble étrange qu'ils se conflit de quelque manière que ce soit.


7 commentaires

Je frappe la même situation, Andrew, étiez-vous capable de le résoudre?


Voyez-vous le problème dans iOS 5.x?


Je vois la même chose dans iOS 6 seulement. Just Justmenté, mais ça ne marche pas. Faites-moi savoir si vous avez résolu cela.


Comme indiqué dans ma réponse, cela semble être fixé dans iOS 6.1. Pas 6.0.1 cependant ..


Je vois toujours des problèmes avec cela en 6.1.2. Lorsque l'interruption commence réellement, aucune notification n'est affichée. Lorsque l'interruption se termine réellement, les deux les notifications commencées et finies sont affichées.


Quelqu'un peut-il m'expliquer ce que la notification AvudiosessionDidDibeGinIntiChantRupinotification mentionnée dans la DOCS est? Je ne semble pas que je puisse réellement m'inscrire à cela (identifiant non déclaré)


Ok c'est intéressant, je semble voir le bon comportement (en 6.1.2) lorsque l'audio joue activement lorsque l'interruption se produit. Le problème est que lorsque l'audio dans ma session est en pause et une interruption se produit, il ne postait pas la notification du début jusqu'à la fin de l'interruption.


5 Réponses :


9
votes

En regardant l'en-tête, dans iOS6, il ressemble à AVAudioSessionDelegate est maintenant dépréciée.

Utilisez AVAudioSessionInterruptionNotification au lieu de iOS6.

Mise à jour: Cela n'a pas fonctionné. Je pense qu'il ya un bug dans le cadre.

Oui, dans mon expérience, beginInterruption, ni le travail de AVAudioSessionInterruptionNotification récemment documenté correctement. Ce que je devais faire était de suivre l'état du joueur en utilisant un drapeau local, puis gérer le endInterruption: withFlags: méthode afin de suivre le rétablissement des interruptions.

Avec iOS 6, la reprise d'une interruption sera au moins garder votre AudioPlayer au bon endroit, donc il n'y avait pas besoin pour moi de stocker la dernière fois de jeu connu de mon AVAudioPlayer, je simplement dû jouer à succès.

Voici la solution que je suis venu avec. Il semble que iOS 6 tue vos fichiers audio avec une remise à zéro des médias si un AVPlayer reste résident trop longtemps. Ce qui finit par se produire, est le AVPlayer joue, mais aucun son ne sort. Le taux sur le AVPlayer est 1, mais il n'y a absolument pas de son. Pour ajouter la douleur à la situation, il n'y a pas d'erreur ni sur le AVAudioSession setActive, ni le AVPlayer lui-même qui indique qu'il ya un problème.

Ajoutez au fait que vous ne pouvez pas compter sur appWillResignActive, parce que votre application peut-être déjà en arrière-plan si vous êtes en fonction des gestes de contrôle à distance du tout.

La solution finale, je mis en œuvre était d'ajouter un observateur périodique sur la AVPlayer, et enregistrer la dernière fois connue. Quand je reçois le cas où on m'a donné le contrôle de retour, je crée une nouvelle AVPlayer, charge avec la AVPlayerItem et seekToTime au bon moment.

Il est tout à fait une solution de contournement ennuyeux, mais au moins cela fonctionne, et évite les accidents périodiques qui se passait.


1 commentaires

D'accord. Ni AvudiosSessionInterruptionNotification Ni AvudiosSessionRouTechanGangenotification ne semble fonctionner! J'ai déposé un bug avec Apple et je recommande aux autres de faire la même chose dans l'espoir d'avoir cette API fixée en 6.1. BUGREPORTE.Apple.com/cgi-bin/webObjects/radarweb. WOA / WA / SIGNI N



4
votes

Je peux confirmer qu'à utiliser l'API C, la méthode d'interruption n'est également pas appelée lorsque l'interruption commence; Seulement quand il se termine xxx

J'ai également déposé un rapport de bogue avec Apple pour le problème.

EDIT: Ceci est corrigé dans iOS 6.1 (mais pas iOS 6.0.1)


4 commentaires

Je ne sais pas s'il y a un problème avec votre configuration de code, mais je vois que le rappel d'interruption de la session audio est appelé lorsque l'interruption commence sur un périphérique IOS 6.


Intéressant - j'ai Téléchargé l'exemple J'ai envoyé à Apple - Pourriez-vous lui donner un aller et voir si le NSLOG est imprimé pour notifier le début d'une interruption? Il serait intéressant de savoir si vous définissez vos séances audio différemment?


Le projet que j'ai mentionné ci-dessus fonctionne correctement sur iOS 6.1 bêta


Lorsque vous utilisez IO distant pour enregistrer directement sur AAC à l'aide d'ExtendediOfile, je vois ce comportement sur iOS 6.0.1 et à la version bêta 6.1 4. Il semble ne pas être corrigé sur le code 6.X du tout.



0
votes

Je viens de vérifier sur mon iPhone 5 (en cours d'exécution IOS 6.0) en définissant un point d'arrêt dans la fonction de rappel de l'audiosessionInterLutListenerListener, qui a été déclarée audioSessioninitialize (), et ce rappel d'interruption est en fait appelé lorsque l'application a une audio active. Unité de session et audio et est interrompue avec un appel téléphonique entrant (Xcode montre l'application arrêtée au point d'arrêt au début de l'interruption, que je continue ensuite de).

J'ai l'application, puis arrêtez son unité audio et désactivez sa session audio. Ensuite, sur le rappel d'interruption de fin, l'application réactive la session audio et redémarre l'unité audio sans problème (l'application enregistre correctement l'audio).


1 commentaires

Le problème ne semble que surface pour moi si nous codons directement vers MPEG4AAC. Tout autre codec et les choses fonctionnent bien. Qu'utilisiez-vous comme format de fichier?



0
votes

J'ai construit une nouvelle nouvelle application de streaming audio ( Avplayer ) ATOP iOS 6.0.x et a trouvé le même problème.

Les délégués sont maintenant obsolètes et nous devons utiliser des notifications, c'est génial, mais voici mes conclusions:

  1. lors d'un appel téléphonique entrant, je n'obtiens que AvaudiosSessionInterruptionTypeDeanded ansed dans mon gestionnaire, avec AvudiosSessionInterruptionPtionShouldResume . La session audio est suspendue automatiquement (Fonds audio) et j'ai juste besoin de reprendre la lecture de Avplayer .
  2. Cependant, lorsque vous essayez de lancer une partie, telle que Racing CSR, j'obtiens étrangement le redouté AvaudiosSessionInterruptionTypebegan mais aucun signe lorsque mon application peut reprendre la lecture, pas même tuer le jeu.

    Maintenant, cela peut dépendre d'autres facteurs, tels que ma catégorie audio (dans mon cas avaudiosessioncateplyplayback ) et les paramètres de mélange des deux applications ( kaudiosessionproperty_overridecategorymixwithers ), je ' Je ne sais pas, mais je vois définitivement quelque chose hors de propos.

    Espérons que d'autres ont signalé que sur 6.1beta ceci est corrigé et je dois encore passer, donc nous verrons.


0 commentaires

2
votes

Appelez simplement:

[[AVAudioSession sharedInstance] setDelegate: self];


1 commentaires

Cela déclenchera le débutant?