#ios #core-audio #audiounit #audiotoolbox #remoteio
Вопрос:
В настоящее время у меня настроен и работает аудиоблок RemoteIO, он просто принимает вход и передает его на выход, поэтому я могу слышать себя через наушники своего iPhone, когда говорю в его микрофон.
Следующий шаг в том, что я хочу сделать, — это добавить дополнительные эффекты и создать цепочку. Я понимаю, что AUGraph
это устарело и что мне нужно использовать kAudioUnitProperty_MakeConnection
, чтобы соединить вещи вместе, но у меня есть несколько ключевых вопросов, и я пока не могу получить аудио.
Во-первых: Если я хочу перейти на вход RemoteIO — > Реверберация — > > Выход RemoteIO, нужны ли мне два экземпляра аудиоустройства RemoteIO? Или я могу использовать тот же самый? Я предполагаю, что только один, но для подключения разных вещей к его области ввода и вывода, но у меня возникли проблемы с этим.
Во-вторых: как в этом участвуют обратные вызовы рендеринга? Я реализовал один обратный вызов рендеринга ( AURenderCallbackStruct
и установил его в качестве kAudioUnitProperty_SetRenderCallback
свойства на моем аудиоустройстве RemoteIO, и при реализации обратного вызова я делаю это:
func performRender(
_ ioActionFlags: UnsafeMutablePointer<AudioUnitRenderActionFlags>,
inTimeStamp: UnsafePointer<AudioTimeStamp>,
inBufNumber: UInt32,
inNumberFrames: UInt32,
ioData: UnsafeMutablePointer<AudioBufferList>
) -> OSStatus {
guard let unit = audioUnit else { crash("Asked to render before the AURemoteIO was created.") }
return AudioUnitRender(unit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData)
}
Нужен ли мне обратный вызов рендеринга вообще, чтобы это сработало? Нужно ли мне два, один для рендеринга из RemoteIO -> Реверберация, а другой для рендеринга обратно в Reverb ->> RemoteIO?
Документация CoreAudio, как известно, отрывочна, но у меня возникли проблемы с поиском какой-либо актуальной информации о том, как это сделать, без AUGraph
которой это не рекомендуется.
Любой совет очень ценен!
Ответ №1:
Вам нужен только один пульт дистанционного управления (приложения получают только один), не требуется никаких явных обратных вызовов рендеринга (если вы не синтезируете образцы в коде), и если вы добавите входные соединения kAudioUnitProperty_MakeConnection во всю цепочку аудиоустройств, запуск выходного устройства будет извлекать данные из остальной цепочки устройств, вплоть до микрофона (или из того, что ОС подключила к микрофонному входу).