【问题标题】:Adding an Effect Audio Unit on to my current Setup在我当前的设置中添加效果音频单元
【发布时间】:2016-04-05 22:02:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: core-audio audiounit


    【解决方案1】:

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

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

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

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

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

    会发生什么:

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

    图表很好,因为您可以将事物“连接”在一起并在信号链中添加/删除事物。它只是不断拉动整个链条,最终您将数据提供给链条中的第一个单元。

    如果您以前从未制作过图表,请务必绝对检查每一步的返回码。

    所有这些函数都有错误代码返回一个 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
    

    【讨论】:

    • 谢谢。实际上,在查看我的图形构造函数一个小时后,我意识到我不需要第三个单元来为混响单元提供数据流,而是需要两个单元和一个混响回调函数。所以我猜这个图不仅初始化了音频单元,而且当你建立连接时,它会在后台创建并分配回调过程?
    • 实际上“节点”是连接的。我的措辞可能会更好一些。 AUGraphConnectNodeInput 将两个节点连接在一起。是的 - 一旦你正确连接了所有节点,AUGraphInitialize 将初始化单元。
    • 这不只是语义吗?节点已连接,音频单元已连接。最终结果是一个单元从它之前的单元中提取数据,依此类推。
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2019-07-26
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多