Как подключить несколько аудиоустановок в Swift?

#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 во всю цепочку аудиоустройств, запуск выходного устройства будет извлекать данные из остальной цепочки устройств, вплоть до микрофона (или из того, что ОС подключила к микрофонному входу).