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

113

Я работаю с AUGraphAudio Units API для воспроизведения и записи звука в моем приложении 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. Этот результат создается только при вызове API AUGraph из его обратного вызова рендеринга. Это означает, что требуемая блокировка была удержана в то время другим потоком . Если вы видите этот результирующий код, вы можете попытаться выполнить действие еще раз - обычно это цикл рендеринга NEXT (тем временем блокировка может быть снята), или вы можете делегировать этот вызов другому потоку в своем приложении. Не следует вращать или останавливать поток рендеринга.

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

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

Алексей Страх
источник
Что setupAudioForGraphделать? Вы сначала AUGraphInitialize граф?
cvu 01
6
Да, setupAudioForGraph создает и инициализирует график. В большинстве случаев он работает нормально. Проблема тут в параллельном доступе или что-то в этом роде. Если один раз запустить и один раз остановить - все работает отлично.
Алексей Страх
1
Я бы поискал способ узнать, существует ли блокировка мьютекса, и если она есть, продолжайте цикл, если не порождает AUGraph.
Taylor

Ответы:

1

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

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

return playing;

}

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

Jaymin
источник