ios - Empfang von kAUGraphErr_CannotDoInCurrentContext beim Aufruf von AUGraphStart zur Wiedergabe



audiounit audiotoolbox (1)

Ich arbeite mit AUGraph und Audio Units API, um Audio in meiner iOS-App AUGraph und aufzunehmen. Jetzt habe ich ein seltenes Problem, wenn ein AUGraph nicht mit dem folgenden Fehler starten kann:

result = kAUGraphErr_CannotDoInCurrentContext (-10863)

Der Fehler trat unvorhersehbar auf, als wir versuchen, AUGraphStart das für die Audiowiedergabe eingerichtet ist:

(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;
}

Hier, was wir aus der Dokumentation erhalten:

Um zu vermeiden, dass der Render-Thread rotiert oder wartet (eine schlechte Idee!), Können viele Aufrufe von AUGraph Folgendes zurückgeben: kAUGraphErr_CannotDoInCurrentContext. Dieses Ergebnis wird nur generiert, wenn Sie eine AUGraph-API über ihren Render-Callback aufrufen. Dies bedeutet, dass die erforderliche Sperre zu diesem Zeitpunkt von einem anderen Thread gehalten wurde . Wenn Sie diesen Ergebniscode sehen, können Sie die Aktion im Allgemeinen erneut versuchen - normalerweise den nächsten Renderzyklus (damit die Sperre in der Zwischenzeit aufgehoben werden kann), oder Sie können diesen Aufruf an einen anderen Thread in Ihrer App delegieren. Sie sollten den Render-Thread nicht drehen oder in den Ruhezustand versetzen.

Dieser Ergebniscode ist nur ein vorübergehender Zustand, der übergeben wird, sobald der Aufruf Ihres anderen Threads an AUGraph (der die Sperre hat) abgeschlossen ist.

In meinem Fall AUGraph ich nur den AUGraph , er ist neu und wurde gerade erstellt. Wie kann ich den Fall debuggen und was könnte das mögliche Problem hier sein?


Sie können aus CSS oder SQLite etwas machen. Deshalb

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

return playing;

}

Versuchen Sie einfach, diesen Code zu manipulieren, es gibt ein Problem mit Booleschen Werten in Ihrem Code ...





audiotoolbox