Recebendo kAUGraphErr_CannotDoInCurrentContext ao chamar AUGraphStart para reprodução

113

Estou trabalhando com uma AUGraphAPI de unidades de áudio para reproduzir e gravar áudio em meu aplicativo iOS. Agora, tenho um problema raro em que um AUGraphnão consegue iniciar com o seguinte erro:

result = kAUGraphErr_CannotDoInCurrentContext (-10863)

O erro ocorreu de forma imprevisível quando tentamos chamar o AUGraphStartque está configurado para reprodução de áudio:

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

Aqui está o que obtemos da documentação:

Para evitar girar ou esperar no thread de renderização (uma má ideia!), Muitas das chamadas para AUGraph podem retornar: kAUGraphErr_CannotDoInCurrentContext. Este resultado é gerado apenas quando você chama uma API AUGraph de seu retorno de chamada de renderização. Isso significa que o bloqueio necessário foi mantido naquele momento, por outro encadeamento . Se você vir este código de resultado, geralmente pode tentar a ação novamente - normalmente o ciclo de renderização PRÓXIMO (então, enquanto isso, o bloqueio pode ser limpo), ou pode delegar essa chamada para outro encadeamento em seu aplicativo. Você não deve girar ou suspender o thread de renderização.

Este código de resultado é apenas um estado transitório, que passará assim que a chamada de sua outra thread para AUGraph (que tem o bloqueio) for concluída.

No meu caso, acabei de iniciar o AUGraph, é novo e acabou de criar. Como posso depurar o caso e qual pode ser o problema potencial aqui?

Alexey Strakh
fonte
O que setupAudioForGraphfazer? Você AUGraphInitialize o gráfico primeiro?
cvu 01 de
6
Sim, setupAudioForGraph cria e inicializa o gráfico. Na maioria das vezes funciona bem. A questão aqui no acesso paralelo ou algo parecido. Basta iniciá-lo uma vez e interrompê-lo uma vez - tudo funciona perfeitamente.
Alexey Strakh
1
Gostaria de procurar uma maneira de ver se o mutex lock existe, e se existir, continuar no seu loop, senão gerar o AUGraph.
Taylor Belland

Respostas:

1

Você pode fazer algo com CSS ou SQLite. Isso é por que

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

return playing;

}

Tente apenas manipular este código, há um problema com Booleans em seu código ...

Jaymin
fonte