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



我正在为我的iphone创建一个玩具合成器项目,在那里我可以拖动我的手指,并根据x&y坐标。它效果优美,听起来很棒,颜色甚至会根据声音的音调和音高而变化。雅虎。但我现在正试图为这个声音添加效果,我已经达到了某种程度的困惑。

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

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

我错过了什么?我可以自己使用遥控器来增加混响吗?

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

RemoteIO输入实际上是一个拉式体系结构(而不是推式)。渲染回调是您提供输入样本(sin-wav数据)的地方。它每X毫秒调用一次,并要求您将样本复制到中。所以它会提取你的数据。你没有按照自己的条件构建缓冲区并"推入"音频系统。相反,您可以在它请求更多数据(pull)时将其复制进来。

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

[混响]-[远程IO(输出元件)]

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

情况如下:

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

这个图很好,因为你可以把东西"连接"在一起,并在信号链中添加/删除东西。它只是不断地拉动链条,最终您将数据提供给链条中的第一个单元。

如果您以前从未绘制过图形,请确保绝对检查"每一步"的返回代码。

所有这些函数都有错误代码,返回操作系统状态

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

最新更新