我正在为我的iphone创建一个玩具合成器项目,我可以在那里拖动手指,根据x& y坐标。它工作得很漂亮,听起来很棒,颜色甚至根据声音的音调和音调而变化。雅虎。但我现在正试图为这种声音添加效果,我已经遇到了某种混乱。
目前,我没有使用AUGraph。我更简单地调用remoteIO单元并为其分配一个渲染回调函数,在这里我将连续的样本值流提供给形成一个sin波。我听说我的iphone6 +有一个清晰的440.00hz sin wave播放,非常好。
但是如果我想在这里添加混响作为第二个组件,我不知道该怎么办,因为输出单元不是"最后一个"音频硬件前的单元?如何设置另一个名为reverbUnit的音频单元并将其连接到我当前的remoteiO?它甚至没有意义。一个人需要3个单位。第一个产生sin波,第二个是添加混响滤波器,而第三个是推送到硬件。
我错过了什么?我可以通过自己使用remoteio进行混响吗?
答案 0 :(得分:2)
是的,最好的方法是使用图表。
RemoteIO输入实际上是一种拉结构(不是推送)。渲染回调是您提供输入样本(sin wav数据)的地方。它每隔X毫秒回调一次,并要求您将样本复制到。所以它会提取你的数据。您没有构建缓冲区并按照条款“推入”音频系统。相反,您在请求更多数据(拉)时将其复制。
因此,如果您想添加更多音频单元,则需要将它们与图形连接起来。 remoteIO单元将是链中的最后一个单元。将在远程IO之前添加混响单元。所以它看起来像这样:
[Reverb] - [RemoteIO(输出元素)]
您的混响输出将转至远程IO输入。当远程IO需要采样时,它会从混响单元中拉出。图形连接负责将远程IO传递给混响单元。然后,这将自动触发您的混响单元的回调。所以你需要在混响输入回调中编写你的样本。
以下是发生的事情:
图表很棒,因为您可以将事物“连接”在一起并添加/删除信号链中的内容。它只是不断拉动链条,最终将数据提供给链中的第一个单元。
如果您之前从未制作过图表,请务必仔细检查每个单步的返回码。
所有这些函数都有错误代码返回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