Что означает CannotDoInCurrentContext при чтении из AudioUnit

#ios #audiounit

#iOS #audiounit

Вопрос:

Я читаю из AudioUnit, используя вызов AudioUnitRender() в цикле в выделенном потоке.

Большую часть времени он возвращает CannotDoInCurrentContext, но он также работает случайным образом (каждые 10 вызовов или около того), предоставляя мне аудиоданные.

Мои аудиоустройства расположены следующим образом mic -> VoiceProcessingIO -> FormatConverter

Мой вызов рендеринга относится к FormatConverter

У меня также есть воспроизведение с помощью: FormatConverter -> VoiceProcessingIO -> Speaker Здесь используется тот же VoiceProcessingIO, но другой форматировщик.

Я попытался перевести режим ожидания после ошибки, но это не заставляет его работать чаще в связи со сбоями. Это заставляет его работать реже в режиме реального времени, но в том же соотношении по отношению к сбоям.

Я не могу использовать для этого обратные вызовы рендеринга, потому что они никогда не запускаются в форматере, кажется, что он использует модель извлечения, и ничто не вытягивает, если я этого не делаю.

Кажется, что некоторые чтения указывают на то, что эта ошибка означает, что не удалось получить блокировку, необходимую для выполнения рендеринга. Но я все равно не вижу, чтобы дождаться освобождения блокировки.

Ответ №1:

AudioUnitRender предназначен только для запуска в контексте аудио, что происходит только для приложения во время обратных вызовов аудиоустройств. Вы можете попробовать поместить вызов render в свой обратный вызов вывода.