Odbieranie kAUGraphErr_CannotDoInCurrentContext podczas wywoływania AUGraphStart w celu odtwarzania

113

Pracuję z AUGraphi Audio Units API, aby odtwarzać i nagrywać dźwięk w mojej aplikacji na iOS. Teraz mam rzadki problem, gdy AUGraphnie można uruchomić z następującym błędem:

wynik = kAUGraphErr_CannotDoInCurrentContext (-10863)

Błąd wystąpił nieprzewidywalnie, gdy próbujemy zadzwonić, AUGraphStartktóry jest skonfigurowany do odtwarzania dźwięku:

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

Oto co otrzymujemy z dokumentacji:

Aby uniknąć obracania się lub czekania w wątku renderowania (zły pomysł!), Wiele wywołań AUGraph może zwrócić: kAUGraphErr_CannotDoInCurrentContext. Ten wynik jest generowany tylko wtedy, gdy wywołujesz interfejs API AUGraph z jego wywołania zwrotnego renderowania. Oznacza to, że zamek, którego wymagał, był utrzymywany w tym czasie przez inny gwint . Jeśli zobaczysz ten kod wynikowy, możesz ogólnie spróbować ponownie wykonać akcję - zwykle jest to kolejny cykl renderowania (więc w międzyczasie blokadę można wyczyścić) lub możesz delegować to wywołanie do innego wątku w aplikacji. Nie powinieneś obracać ani usypiać wątku renderującego.

Ten kod wynikowy jest tylko stanem przejściowym, który przejdzie, gdy tylko wywołanie innego wątku do AUGraph (który ma blokadę) zostanie zakończone.

W moim przypadku po prostu zaczynam AUGraph, jest nowy i właśnie utworzony. Jak mogę zdebugować sprawę i jaki może być potencjalny problem w tym miejscu?

Alexey Strakh
źródło
Co robi setupAudioForGraph? Czy najpierw AUGraph zainicjowałeś wykres?
cvu
6
Tak, setupAudioForGraph tworzy i inicjalizuje wykres. W większości przypadków działa dobrze. Problem tutaj w dostępie równoległym czy coś w tym rodzaju. Jeśli tylko raz uruchomisz i raz zatrzymasz - wszystko działa idealnie.
Alexey Strakh
1
Szukałbym sposobu, aby sprawdzić, czy blokada mutexów istnieje, a jeśli tak, kontynuuj w pętli, jeśli nie, zaszczep AUGraph.
Taylor Belland

Odpowiedzi:

1

Możesz zrobić coś z CSS lub SQLite. Dlatego

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

return playing;

}

Spróbuj po prostu manipulować tym kodem, w Twoim kodzie jest problem z Booleanami ...

Jaymin
źródło