所以我已经阅读了 iOS 的音频单元托管指南,他们一直暗示人们可能总是想要使用 AUGraph 而不是 AU 之间的直接连接。其中最显着的原因是他们提到了高优先级线程,能够在图形运行时重新配置图形以及一般的线程安全性。
我的问题是,鉴于 iOS 并没有真正让您动态加载自定义代码,我正试图尽可能接近“制作我自己的自定义 dsp 效果”。因此,我的方法是创建一个通用输出单元并在其渲染回调中编写 DSP 代码。现在这种方法的问题是,如果我想在图表中将其中两个单元与自定义回调链接起来。由于图必须有一个输出 au(用于 head),因此尝试添加更多输出单元将不会成功。也就是说,我不能在图中依次有 2 个通用 I/O 单元和一个远程 I/O 单元。
如果我真的想使用 AUGraphs,我可以想到一种解决方案:
- 一个图形接口,它在内部保持一个带有单个输出单元的 AUGraph,对于图中的每个连接节点,一个“自定义回调”通用输出节点的列表,这些节点理论上连接到这样的节点。也许它可能是 AUNode 上的类/接口,但希望你明白这一点。
- 如果我在这个图中添加非输出单元,它实际上以通常的方式将它们连接到支持 AUGraph。
但是,如果我添加了一个通用输出节点,这实际上意味着将节点的 au 添加到列表中,并且无论我在图中连接到哪个节点,实际上都会将其输入范围/元素 0 回调设置为:
for each unit in your connected list: call AudioUnitRender(...) and merge in ioData;
因此,“连接”到任意数量的那些“自定义”节点的节点基本上从它们中提取处理后的输出并将其输出到任何下一个非自定义节点。
当然,上面的想法可能有一些松散的结局,但我认为这需要更多的思考。
现在我的问题是,如果我在没有任何 AUGraph 的情况下直接连接 AU 怎么办?如果没有图片中的 AUGraph,我绝对可以将许多带有回调的通用输出单元连接到一个最终的远程 I/O 输出,这似乎工作得很好。事情是kAudioUnitProperty_MakeConnection
一个属性。所以我不确定一旦 AU 被初始化,我就可以重新设置属性。我相信如果我取消初始化就可以了。如果是这样,我不能只获得 GCD 的高优先级队列并分派异步块中取消初始化、重新连接和再次初始化的任何更改吗?