Empfangen von kAUGraphErr_CannotDoInCurrentContext beim Aufrufen von AUGraphStart zur Wiedergabe

113

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

Ergebnis = kAUGraphErr_CannotDoInCurrentContext (-10863)

Der Fehler trat unvorhersehbar auf, wenn wir versuchen, einen Anruf zu tätigen, AUGraphStartder 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 ist, was wir aus der Dokumentation erhalten:

Um ein Drehen oder Warten im Render-Thread zu vermeiden (eine schlechte Idee!), Können viele der Aufrufe von AUGraph Folgendes zurückgeben: kAUGraphErr_CannotDoInCurrentContext. Dieses Ergebnis wird nur generiert, wenn Sie eine AUGraph-API aus ihrem Render-Rückruf 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 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 Status, der übergeben wird, sobald der Aufruf Ihres anderen Threads an AUGraph (der über die Sperre verfügt) abgeschlossen ist.

In meinem Fall starte ich einfach das AUGraph, es ist neu und gerade erstellt. Wie kann ich den Fall debuggen und was könnte hier das potenzielle Problem sein?

Alexey Strakh
quelle
Was macht setupAudioForGraphdas Haben Sie das Diagramm zuerst AUGraphInitialisiert?
CVU
6
Ja, setupAudioForGraph erstellt und initialisiert das Diagramm. Meistens funktioniert es gut. Das Problem hier beim parallelen Zugriff oder so ähnlich. Wenn Sie es nur einmal starten und einmal stoppen, funktioniert alles perfekt.
Alexey Strakh
1
Ich würde nach einer Möglichkeit suchen, um festzustellen, ob die Mutex-Sperre vorhanden ist, und wenn ja, in Ihrer Schleife fortfahren, wenn nicht, AUGraph erzeugen.
Taylor Belland

Antworten:

1

Sie können etwas aus CSS oder SQLite 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 ...

Jaymin
quelle