iOS音频单元:何时使用AUGraph是必要的?

时间:2011-07-18 15:36:55

标签: ios core-audio ipod audiounit

我对iOS编程完全陌生(我更像是一个Android人......)并且必须构建一个处理音频DSP的应用程序。 (我知道这不是接近iOS开发的最简单方法;))

该应用需要能够接受来自以下的输入:

1-内置麦克风 2- iPod库

然后可以对输入声音应用滤波器,结果将输出到:

1-发言人 2-录制到文件

我的问题如下:为了能够将多个过滤器应用于输入,或者通过处理具有不同渲染回调的样本可以应用这些不同的效果,是否需要AUGr​​aph?

如果我选择AUGraph,我需要:每个输入有1个音频单元,输出有1个音频单元,每个效果/滤波器有1个音频输入吗?

最后,如果我不这样做,我可能只有1个音频单元并重新配置它以选择源/目的地?

非常感谢您的回答!我迷失了这些东西......

1 个答案:

答案 0 :(得分:13)

如果你愿意,你可能确实使用了渲染回调,但是内置的音频单元很棒(而且有些东西在NDA等我还不能说,我已经说了太多,如果你有权访问iOS 5 SDK,我建议你看看。

您可以在不使用AUGraph的情况下实现您想要的行为,但建议您这样做,因为它会处理很多事情并节省您的时间和精力。

使用AUGraph

来自Audio Unit Hosting Guide (iOS Developer Library)

  

AUGraph类型为音频单元故事增加了线程安全性:它使您能够动态地重新配置处理链。例如,您可以安全地插入均衡器,甚至可以在播放音频时交换混音器输入的不同渲染回调函数。事实上,AUGraph类型提供了iOS中唯一的API,用于在音频应用中执行此类动态重新配置。

Choosing A Design Pattern (iOS Developer Library)详细介绍了如何选择如何实现音频单元环境。从设置音频会话,图形和配置/添加单元,编写回调。

至于您在图表中想要的音频单元,除了您已经说明的内容之外,您还需要一个 MultiChannel调音台(请参阅Using Specific Audio Units (iOS Developer Library))来混合您的两个音频输入,然后将调音台连接到输出单元。

直接连接

或者,如果您在不使用AUGraph的情况下直接执行此操作,则以下代码是自行将音频单元连接在一起的示例。 (来自Constructing Audio Unit Apps (iOS Developer Library)

  

您也可以建立和断开音频之间的连接   单位直接使用音频单元属性机制。为此,   使用AudioUnitSetProperty函数和。{   kAudioUnitProperty_MakeConnection属性,如清单2-6 中所示。   此方法要求您定义AudioUnitConnection   每个连接的结构作为其属性值。

/*Listing 2-6*/
AudioUnitElement mixerUnitOutputBus  = 0;
AudioUnitElement ioUnitOutputElement = 0;

AudioUnitConnection mixerOutToIoUnitIn;
mixerOutToIoUnitIn.sourceAudioUnit    = mixerUnitInstance;
mixerOutToIoUnitIn.sourceOutputNumber = mixerUnitOutputBus;
mixerOutToIoUnitIn.destInputNumber    = ioUnitOutputElement;

AudioUnitSetProperty (
    ioUnitInstance,                     // connection destination
    kAudioUnitProperty_MakeConnection,  // property key
    kAudioUnitScope_Input,              // destination scope
    ioUnitOutputElement,                // destination element
    &mixerOutToIoUnitIn,                // connection definition
    sizeof (mixerOutToIoUnitIn)
);