Ricezione di kAUGraphErr_CannotDoInCurrentContext quando si chiama AUGraphStart per la riproduzione


113

Sto lavorando con l' AUGraphAPI Audio Units per riprodurre e registrare l'audio nella mia app iOS. Ora ho un raro problema quando un AUGraphnon è in grado di iniziare con il seguente errore:

risultato = kAUGraphErr_CannotDoInCurrentContext (-10863)

L'errore si è verificato in modo imprevedibile quando proviamo a chiamare AUGraphStartche è impostato per la riproduzione 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;
}

Ecco cosa otteniamo dalla documentazione:

Per evitare la rotazione o l'attesa nel thread di rendering (una cattiva idea!), Molte delle chiamate ad AUGraph possono restituire: kAUGraphErr_CannotDoInCurrentContext. Questo risultato viene generato solo quando chiami un'API AUGraph dal suo callback di rendering. Significa che il blocco richiesto era tenuto in quel momento, da un altro thread . Se vedi questo codice risultato, puoi generalmente tentare di nuovo l'azione, in genere il ciclo di rendering NEXT (quindi nel frattempo il blocco può essere cancellato), oppure puoi delegare quella chiamata a un altro thread nella tua app. Non dovresti girare o mettere in stop il thread di rendering.

Questo codice risultato è solo uno stato transitorio, che passerà non appena la chiamata dell'altro thread ad AUGraph (che ha il blocco) sarà completata.

Nel mio caso, ho appena avviato il AUGraph, è nuovo e appena creato. Come posso eseguire il debug del caso e quale potrebbe essere il potenziale problema qui?


Cosa fa setupAudioForGraph? Hai inizializzato prima il grafico con AUGraph?
cvu

6
Sì, setupAudioForGraph crea e inizializza il grafico. Il più delle volte funziona bene. Il problema qui in accesso parallelo o qualcosa del genere. Se basta avviarlo una volta e fermarlo una volta, tutto funziona perfettamente.
Alexey Strakh

1
Cercherei un modo per vedere se il blocco del mutex esiste e, se lo fa, continua nel tuo ciclo, se non genera AUGraph.
Taylor Belland

Risposte:


1

Puoi creare qualcosa con CSS o SQLite. Ecco perché

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

return playing;

}

Prova a manipolare solo questo codice, c'è un problema con i booleani nel tuo codice ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.