Réception de kAUGraphErr_CannotDoInCurrentContext lors de l'appel de AUGraphStart pour la lecture

113

Je travaille avec AUGraphet l'API Audio Units pour lire et enregistrer de l'audio dans mon application iOS. Maintenant, j'ai un problème rare lorsqu'un AUGraphest incapable de démarrer avec l'erreur suivante:

résultat = kAUGraphErr_CannotDoInCurrentContext (-10863)

L'erreur s'est produite de manière imprévisible lorsque nous essayons d'appeler AUGraphStartce qui est configuré pour la lecture audio:

(BOOL)startRendering
{
    if (playing) {
        return YES;
    }

    playing = YES;

    if (NO == [self setupAudioForGraph:&au_play_graph playout:YES]) {
        print_error("Failed to create play AUGraph",0);
        playing = NO;
        return NO;
    }

    //result = kAUGraphErr_CannotDoInCurrentContext (-10863)
    OSStatus result = AUGraphStart(au_play_graph);
    if (noErr != result) {
        print_error("AUGraphStart", result);
        playing = NO;
    }

    return playing;
}

Voici ce que nous tirons de la documentation:

Pour éviter de tourner ou d'attendre dans le thread de rendu (une mauvaise idée!), De nombreux appels à AUGraph peuvent renvoyer: kAUGraphErr_CannotDoInCurrentContext. Ce résultat n'est généré que lorsque vous appelez une API AUGraph à partir de son rappel de rendu. Cela signifie que le verrou requis a été maintenu à ce moment-là, par un autre thread . Si vous voyez ce code de résultat, vous pouvez généralement tenter à nouveau l'action - généralement le cycle de rendu NEXT (donc entre-temps le verrou peut être effacé), ou vous pouvez déléguer cet appel à un autre thread de votre application. Vous ne devez pas faire tourner ou mettre en veille le thread de rendu.

Ce code de résultat n'est qu'un état transitoire, qui passera dès que l'appel de votre autre thread à AUGraph (qui a le verrou) se termine.

Dans mon cas, je viens de démarrer le AUGraph, c'est nouveau et vient de se créer. Comment puis-je déboguer le cas et quel pourrait être le problème potentiel ici?

Alexey Strakh
la source
Que fait setupAudioForGraph-on? Avez-vous AUGraphInitialize le graphique en premier?
cvu
6
Oui, setupAudioForGraph crée et initialise le graphique. La plupart du temps, cela fonctionne bien. Le problème ici en accès parallèle ou quelque chose comme ça. Si vous le démarrez une fois et l'arrêtez une fois, tout fonctionne parfaitement.
Alexey Strakh
1
Je chercherais un moyen de voir si le verrou mutex existe, et si c'est le cas, continuez dans votre boucle, sinon engendrez l'AUGraph.
Taylor Belland

Réponses:

1

Vous pouvez créer quelque chose avec CSS ou SQLite. C'est pourquoi

OSStatus result = AUGraphStart(au_play_graph);
if (noErr != result) {
    print_error("AUGraphStart", result);
    playing = NO;
}

return playing;

}

Essayez de simplement manipuler ce code, il y a un problème avec les booléens dans votre code ...

Jaymin
la source