8 votes

Enregistrement audio Interruption iOS 6 Erreur

Le projet de démonstration d'Apple aurioTouch2 démontre le même problème iOS-6 que j'ai avec la gestion des interruptions audio en mode d'enregistrement.

Le scénario est très spécifique. Lorsqu'on est en mode d'enregistrement audio, un appel est passé, puis est répondu (le refus de l'appel ne cause pas de bug). Ensuite, après avoir raccroché, l'application reprend le focus et ne parvient pas à continuer l'enregistrement.

Le message d'erreur est : AUIOClient_StartIO a échoué (2003329396) Ce code d'erreur se traduit utilement par le mot 'quoi'.

Le projet aurioTouch2 était une mise à jour pour iOS-5, mais ne fonctionne pas pour iOS-6. Semble être un bug assez critique pour mon application, puisque l'appareil est un "téléphone".

J'ai essayé toutes les variations sensées sans succès. Quelqu'un a rencontré le même problème ? Merci beaucoup.

Modification : Voici le code qui a résolu le problème pour moi. La correction est notée dans les commentaires. Pas vraiment élégant, mais je prends tout à ce stade.

Cette méthode est appelée à un moment donné après que l'application soit revenue à un état actif. J'ai configuré un déclencheur de fin d'interruption pour définir un drapeau, et plus tard lorsque les choses sont à nouveau actives, je vérifie le drapeau, puis j'appelle cette méthode ici.

-(void) handleEndInterruption {
    // Réinitialiser la session audio
    UInt32 catégorie = kAudioSessionCategory_PlayAndRecord;
    AudioSessionSetProperty ( kAudioSessionProperty_AudioCategory, sizeof (catégorie), &catégorie );

    // Réactiver la session audio actuelle
    AudioSessionSetActive(YES);

    // Faites ceci, et échouez avec : AUIOClient_StartIO a échoué (2003329396)
    [self createAUProcessingGraph];
    [self initializeAndStartProcessingGraph];

    // Faites-le une deuxième fois et cela fonctionne
    AudioSessionSetActive(NO);
    AudioSessionSetActive(YES);
    [self createAUProcessingGraph];
    [self initializeAndStartProcessingGraph];

    // Restaurer le contexte open al
    alcMakeContextCurrent([AudioDispatcher sharedInstance].audioContext);

    // 'dépause' mon contexte
    alcProcessContext([AudioDispatcher sharedInstance].audioContext);
}

0voto

Vince Points 210

J'ai rencontré le même problème et j'ai trouvé une solution.

En utilisant le framework téléphonique de base pour détecter l'appel entrant, j'ai arrêté l'enregistrement "sans délicatesse" en fermant le fichier, sans toucher aux files audio. Ensuite, lorsque l'application reprend, j'affiche l'enregistrement en pause, l'utilisateur peut alors reprendre l'enregistrement. Pendant ce temps, j'ai redémarré toutes mes files audio de base.

Soyez prudent avec le callEventHandler de CTCallCenter si vous utilisez ARC. Il n'est pas libéré correctement, alors n'oubliez pas de le définir sur nil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X