将效果音频单元添加到我当前的设置
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。这将自动触发您的混响单元的回调。所以你现在需要在混响输入回调中编写你的样本。
事情是这样的:
- 硬件说给我一些样品。
- 它会调用您的远程 IO 渲染
打回来。
- 您的远程 IO 调用您的混响输入回调
(通过图连接)
- 您为混响输入提供样本
回调。
该图很不错,因为您可以将 "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
我正在为我的 iphone 创建一个玩具合成器项目,我可以在其中拖动手指并根据 x 和 y 坐标改变频率和音量。它工作精美,听起来很棒,颜色甚至会根据声音的音调和音高而变化。雅虎。但我现在正试图为这种声音添加效果,但我遇到了某种困惑。
目前,我没有使用 AUGraph。我更简单地调用 remoteIO 单元并为其分配一个渲染回调函数,我在其中为它提供连续的样本值流以形成正弦波。我听到我的 iphone6+ 播放清晰的 440.00hz 正弦波,非常好。
但是如果我想在这里添加混响作为第二个组件,我不确定该怎么做,因为输出单元不是音频硬件之前的 "last" 单元吗?如何设置另一个名为 reverbUnit 的音频单元并将其连接到我当前的 remoteiO ?这甚至没有意义。这里需要 3 个单位。第一个生成正弦波,第二个添加混响滤波器,第三个推送到硬件。
我错过了什么?我可以通过自己使用 remoteio 来添加混响吗?
是的,最好的方法是使用图表。
RemoteIO 输入实际上是拉式架构(不是推式)。渲染回调是您提供输入样本(sin wav 数据)的地方。它每隔 X 毫秒回调一次,并要求您将样本复制到 .所以它会提取你的数据。您不是按照您的条件在音频系统中构建缓冲区和 "pushing"。相反,您可以在它请求更多数据(拉)时复制它。
所以如果你想添加更多的音频单元,你需要用一个图来连接它们。 remoteIO 单元将是链中的最后一个。在远程 IO 之前将添加一个混响单元。所以它看起来像这样:
[混响]-[RemoteIO(输出元素)]
您的混响输出到远程 IO 输入。当远程 IO 需要样本时,它会从混响单元中提取。图形连接负责将拉力传递给混响单元的远程 IO。这将自动触发您的混响单元的回调。所以你现在需要在混响输入回调中编写你的样本。
事情是这样的:
- 硬件说给我一些样品。
- 它会调用您的远程 IO 渲染 打回来。
- 您的远程 IO 调用您的混响输入回调 (通过图连接)
- 您为混响输入提供样本 回调。
该图很不错,因为您可以将 "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