我正在为我的iphone创建一个玩具合成器项目,在那里我可以拖动我的手指,并根据x&y坐标。它效果优美,听起来很棒,颜色甚至会根据声音的音调和音高而变化。雅虎。但我现在正试图为这个声音添加效果,我已经达到了某种程度的困惑。
目前,我没有使用AUGraph。我更简单的是调用远程IO单元,并为其分配一个渲染回调函数,在该函数中,我向其提供一个连续的采样值流,以形成正弦波。我听到我的iphone6+播放了一个清晰的440.00hz正弦波,非常好。
但是,如果我想在这里添加混响作为第二个组件,我不知道该怎么办,因为输出单元不是音频硬件之前的"最后一个"单元吗?如何设置另一个名为reverbUnit的音频单元并将其连接到我当前的remoteiO??这根本没有道理。这里需要3个单元。第一个生成正弦波,第二个添加混响滤波器,第三个推送到硬件。
我错过了什么?我可以自己使用遥控器来增加混响吗?
是的,最好的方法是使用图形。
RemoteIO输入实际上是一个拉式体系结构(而不是推式)。渲染回调是您提供输入样本(sin-wav数据)的地方。它每X毫秒调用一次,并要求您将样本复制到中。所以它会提取你的数据。你没有按照自己的条件构建缓冲区并"推入"音频系统。相反,您可以在它请求更多数据(pull)时将其复制进来。
因此,如果你想添加更多的音频单元,你需要用一个图形将它们连接起来。远程IO单元将是链中的最后一个。在远程IO之前会添加一个混响单元。所以它看起来像这样:
[混响]-[远程IO(输出元件)]
你的混响输出到远程IO输入。当远程IO需要采样时,它会从混响单元中拉出。图形连接负责远程IO,将pull-on传递到混响单元。这将自动触发你的混响单元的回调。所以你现在需要在混响输入回调中编写你的样本。
情况如下:
- 硬件说给我一些样品
- 它调用您的远程IO渲染回调
- 您的远程IO调用您的混响输入回调(通过图形连接)
- 您为混响输入提供样本回调
这个图很好,因为你可以把东西"连接"在一起,并在信号链中添加/删除东西。它只是不断地拉动链条,最终您将数据提供给链条中的第一个单元。
如果您以前从未绘制过图形,请确保绝对检查"每一步"的返回代码。
所有这些函数都有错误代码,返回操作系统状态
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