将效果音频单元添加到我当前的设置

Adding an Effect Audio Unit on to my current Setup

我正在为我的 iphone 创建一个玩具合成器项目,我可以在其中拖动手指并根据 x 和 y 坐标改变频率和音量。它工作精美,听起来很棒,颜色甚至会根据声音的音调和音高而变化。雅虎。但我现在正试图为这种声音添加效果,但我遇到了某种困惑。

目前,我没有使用 AUGraph。我更简单地调用 remoteIO 单元并为其分配一个渲染回调函数,我在其中为它提供连续的样本值流以形成正弦波。我听到我的 iphone6+ 播放清晰的 440.00hz 正弦波,非常好。

但是如果我想在这里添加混响作为第二个组件,我不确定该怎么做,因为输出单元不是音频硬件之前的 "last" 单元吗?如何设置另一个名为 reverbUnit 的音频单元并将其连接到我当前的 remoteiO ?这甚至没有意义。这里需要 3 个单位。第一个生成正弦波,第二个添加混响滤波器,第三个推送到硬件。

我错过了什么?我可以通过自己使用 remoteio 来添加混响吗?

是的,最好的方法是使用图表。

RemoteIO 输入实际上是拉式架构(不是推式)。渲染回调是您提供输入样本(sin wav 数据)的地方。它每隔 X 毫秒回调一次,并要求您将样本复制到 .所以它会提取你的数据。您不是按照您的条件在音频系统中构建缓冲区和 "pushing"。相反,您可以在它请求更多数据(拉)时复制它。

所以如果你想添加更多的音频单元,你需要用一个图来连接它们。 remoteIO 单元将是链中的最后一个。在远程 IO 之前将添加一个混响单元。所以它看起来像这样:

[混响]-[RemoteIO(输出元素)]

您的混响输出到远程 IO 输入。当远程 IO 需要样本时,它会从混响单元中提取。图形连接负责将拉力传递给混响单元的远程 IO。这将自动触发您的混响单元的回调。所以你现在需要在混响输入回调中编写你的样本。

事情是这样的:

  1. 硬件说给我一些样品。
  2. 它会调用您的远程 IO 渲染 打回来。
  3. 您的远程 IO 调用您的混响输入回调 (通过图连接)
  4. 您为混响输入提供样本 回调。

该图很不错,因为您可以将 "connect" 东西放在一起,并在信号链中 add/remove 东西。它只是不断拉动链条,您最终会向链条中的第一个单元提供数据。

如果您以前从未制作过图表,请务必彻底检查每个步骤的 return 代码。

所有这些函数都有错误代码 returns 和 OSStatus

AUGraphOpen, AUGraphNodeInfo, AUGraphConnectNodeInput, AUGraphInitialize, AudioUnitSetProperty, AUGraphStart,  etc.

初始化图表后,您可以使用 CAShow(_audioGraph) 将其显示到控制台并获得如下输出:

Member Nodes:
node 1: 'auou' 'rioc' 'appl', instance 0x7a141060 O I
node 2: 'aumx' 'mcmx' 'appl', instance 0x7a021810 O I
node 3: 'aufx' 'rvb2' 'appl', instance 0x7a0a84a0 O I
node 4: 'aufc' 'splt' 'appl', instance 0x7a025b90 O I
node 5: 'aufc' 'conv' 'appl', instance 0x7a24b9e0 O I
node 6: 'augn' 'afpl' 'appl', instance 0x7a22a220 O  
Connections:
node   2 bus   0 => node   3 bus   0  [ 2 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node   3 bus   0 => node   1 bus   0  [ 2 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node   4 bus   0 => node   2 bus   0  [ 2 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node   5 bus   0 => node   4 bus   0  [ 2 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
Input Callbacks:
{0x6ccf0, 0x7a13da00} => node   5 bus   0  [2 ch, 44100 Hz]
CurrentState:
mLastUpdateError=0, eventsToProcess=F, isInitialized=T, isRunning=F