Подтвердить что ты не робот

Получение kAUGraphErr_CannotDoInCurrentContext при вызове AUGraphStart для воспроизведения

Я работаю с AUGraph и Audio Units API для воспроизведения и записи аудио в моем приложении iOS. Теперь у меня есть редкая проблема, когда AUGraph не может запуститься со следующей ошибкой:

result = kAUGraphErr_CannotDoInCurrentContext (-10863)

Ошибка произошла непредсказуемо, когда мы пытаемся вызвать AUGraphStart, который настроен для воспроизведения аудио:

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

Вот что мы получаем из документации:

Чтобы избежать вращения или ожидания в потоке рендера (плохая идея!), Многие из звонков в AUGraph можно вернуть: kAUGraphErr_CannotDoInCurrentContext. Этот результат только генерируется когда вы вызываете AUGraph API из его обратного вызова рендеринга. Это означает, что требуемая блокировка удерживалась в то время другим потоком. Если Вы видите этот код результата, как правило, вы можете попытаться повторить действие - как правило, следующий цикл рендеринга (таким образом, блокировка может быть очищен), или вы можете делегировать этот вызов другому потоку в вашем приложении. Вы не должны вращать или усыплять поток рендеринга.

Этот код результата является только переходным состоянием, которое пройдет, как только как ваш другой поток вызова AUGraph (который имеет блокировку) завершается.

В моем случае я просто запускаю AUGraph, он новый и только что созданный. Как я могу отладить дело и что может быть потенциальной проблемой здесь?

4b9b3361

Ответ 1

Вы можете сделать что-то из CSS или SQLite. Вот почему

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

return playing;

}

Попробуйте просто манипулировать этим кодом, в вашем коде есть проблема с логическими значениями...