2

我目前有一个 RemoteIO 音频单元配置并工作,它只接受输入,并将其传递给输出,所以当我对着麦克风说话时,我可以通过 iPhone 的耳机听到自己的声音。

我想做的下一步是添加可选效果并创建一个链。我知道它AUGraph已被弃用,我需要用它kAudioUnitProperty_MakeConnection来将事物连接在一起,但我有几个关键问题,目前还无法输出音频。

首先:如果我想去 RemoteIO Input -> Reverb -> RemoteIO Output,我需要两个 RemoteIO Audio Unit 实例吗?或者我可以使用同一个吗?我猜只是一个,但是要将不同的东西连接到它的输入和输出范围,但我很难做到这一点。

其次:渲染回调如何发挥作用?我实现了一个渲染回调(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 渲染,另一个渲染回 Reverb -> RemoteIO?

CoreAudio 文档是出了名的粗略,但我很难找到任何关于如何做到这一点的最新信息,而没有AUGraph这些信息已被弃用。

任何建议都非常感谢!

4

1 回答 1

0

您只需要一个 RemoteIO(应用程序只有一个),不需要任何显式渲染回调(除非您在代码中合成样本),如果您在整个音频单元链上添加 kAudioUnitProperty_MakeConnection 输入连接,则启动输出单元将从单元链的其余部分提取数据,一直返回到麦克风(或从操作系统连接到麦克风输入的任何位置)。

于 2021-11-23T20:46:56.950 回答