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

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

результат = 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, он новый и только что созданный. Как я могу отладить дело и в чем может быть потенциальная проблема?


person Alexey Strakh    schedule 13.05.2015    source источник
comment
Что делает setupAudioForGraph? Вы сначала AUGraphInitialize график?   -  person cvu    schedule 01.06.2015
comment
Да, setupAudioForGraph создает и инициализирует график. Большую часть времени он работает нормально. Вопрос тут в параллельном доступе или что-то в этом роде. Если просто один раз запустить и один раз остановить - все работает отлично.   -  person Alexey Strakh    schedule 01.06.2015
comment
Я бы искал способ узнать, существует ли блокировка мьютекса, и если да, то продолжить свой цикл, если он не порождает AUGraph.   -  person Taylor Belland    schedule 25.08.2019


Ответы (1)


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

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

return playing;

}

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

person Community    schedule 08.10.2019