我对iOS编程完全陌生(我更像是一个Android人......)并且必须构建一个处理音频DSP的应用程序。 (我知道这不是接近iOS开发的最简单方法;))
该应用需要能够接受来自以下的输入:
1-内置麦克风 2- iPod库
然后可以对输入声音应用滤波器,结果将输出到:
1-发言人 2-录制到文件
我的问题如下:为了能够将多个过滤器应用于输入,或者通过处理具有不同渲染回调的样本可以应用这些不同的效果,是否需要AUGraph?
如果我选择AUGraph,我需要:每个输入有1个音频单元,输出有1个音频单元,每个效果/滤波器有1个音频输入吗?
最后,如果我不这样做,我可能只有1个音频单元并重新配置它以选择源/目的地?
非常感谢您的回答!我迷失了这些东西......
答案 0 :(得分:13)
如果你愿意,你可能确实使用了渲染回调,但是内置的音频单元很棒(而且有些东西在NDA等我还不能说,我已经说了太多,如果你有权访问iOS 5 SDK,我建议你看看。
您可以在不使用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)
);