Recibiendo kAUGraphErr_CannotDoInCurrentContext al llamar a AUGraphStart para la reproducción

113

Estoy trabajando con la AUGraphAPI de Audio Units para reproducir y grabar audio en mi aplicación iOS. Ahora tengo un problema poco común cuando AUGraphno puedo comenzar con el siguiente error:

resultado = kAUGraphErr_CannotDoInCurrentContext (-10863)

El error ocurrió de manera impredecible cuando intentamos llamar al AUGraphStartque está configurado para la reproducción de 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;
}

Aquí lo que obtenemos de la documentación:

Para evitar girar o esperar en el hilo de renderizado (¡una mala idea!), Muchas de las llamadas a AUGraph pueden devolver: kAUGraphErr_CannotDoInCurrentContext. Este resultado solo se genera cuando llama a una API AUGraph desde su devolución de llamada de renderizado. Significa que el bloqueo que requería estaba retenido en ese momento, por otro hilo . Si ve este código de resultado, generalmente puede intentar la acción nuevamente, generalmente el SIGUIENTE ciclo de procesamiento (por lo que, mientras tanto, se puede borrar el bloqueo), o puede delegar esa llamada a otro hilo en su aplicación. No debe girar o poner en suspensión el hilo de renderizado.

Este código de resultado es solo un estado transitorio, que pasará tan pronto como se complete la llamada de su otro hilo a AUGraph (que tiene el bloqueo).

En mi caso, acabo de empezar AUGraph, es nuevo y recién creado. ¿Cómo puedo depurar el caso y cuál podría ser el problema potencial aquí?

Alexey Strakh
fuente
¿Qué setupAudioForGraphhacer? ¿AUGraphInitializó el gráfico primero?
cvu
6
Sí, setupAudioForGraph crea e inicializa el gráfico. La mayoría de las veces funciona bien. El problema aquí en acceso paralelo o algo así. Si lo inicia una vez y lo detiene una vez, todo funciona perfectamente.
Alexey Strakh
1
Buscaría una forma de ver si existe el bloqueo mutex, y si existe, continuar en su ciclo, si no genera el AUGraph.
Taylor Belland

Respuestas:

1

Puedes hacer algo con CSS o SQLite. Esta es la razón por

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

return playing;

}

Intente manipular este código, hay un problema con los booleanos en su código ...

Jaymin
fuente