我可以发送使用 AVAudioSinkNode 接收的声音缓冲区以使用 AVAudioSourceNode 实时呈现吗?

Can I send sound buffers received using AVAudioSinkNode to be rendered in real-time using AVAudioSourceNode?

我正在试验新的 AVAudioSinkNode and AVAudioSourceNode 节点,用于 AVAudioEngine。

在设置方面,类似于另一个 中描述的测试,我的接收节点连接到输入节点(例如麦克风),我的源节点连接到输出节点(例如扬声器) ).接收器回调按预期工作。另外,在源节点一侧,我生成了一个正弦波信号——源节点似乎也正常工作。

问题

出于测试目的,我想将在接收器节点捕获的(浮动)缓冲区发送到源节点,最好是实时发送,而不保存到文件中。这应该具有将麦克风输入重播到扬声器输出的效果。有没有(简单的?)方法来做到这一点?

本质上,我正在寻找一种将汇节点连接到源节点的方法,即使这些节点可能不打算以这种方式使用,因为汇节点没有输出总线而源节点有没有输入总线 (Source).

我假设我可以将输入节点连接到连接到输出节点的混音器,以便将麦克风输入通道传输到扬声器,但出于我的目的,我想在配置中使用新的接收器和源节点作为描述。

我在想我需要以某种方式将我的接收器节点捕获的缓冲区排队,直到它们可以被源节点读取以填充它自己的缓冲区。我查看了音频队列服务,但它似乎不合适。

实时执行此操作的方法是使用音频单元回调(其缓冲区可以小至几毫秒)。它们几乎总是相同的大小(除了可能在设备电源状态更改时),所以只需保存每一个,根据需要处理它,并为下一个输出做好准备,几毫秒后。或者使用 circular/ring fifo/buffer。 iOS 中的 RemoteIO 音频单元已同步 I/O。