iOS:Audio Unit RemoteIO AudioBuffer操作(即来自麦克风的声音效果)

问题描述:

我一直在玩苹果的aurioTouch演示,这是他们的音频单元教程的示例代码。此应用程序允许从麦克风同时输入/输出。给演讲者。它还呈现麦克风输入声音的立体画面。iOS:Audio Unit RemoteIO AudioBuffer操作(即来自麦克风的声音效果)

在这个低级别过程的真正高级别中,示例代码定义了一个AudioComponent(在本例中为允许同时输入/输出的RemoteIO),并且此音频单元有一个回调回调。在回调中,他们根据麦克风的AudioBuffer声音数据进行一些音频过滤(DC拒绝滤波器)和立体显示的可视化。

我的最终目标是根据麦克风的输入创建自己的定制声音失真音频单元。我认为基于音频单元教程的正确方法是制作第二个音频单元,并将它们连接到音频处理图表。但是,我读过iOS不允许您注册自己的自定义音频单元。我的问题是:

  1. 我可以做的AudioBufferList直接操纵,我从remoteIO音频单元呈现回调访问(因为他们似乎已经在做这一点,并在其上应用的音频过滤器)和在那里创建自己的自定义声音失真?
  2. 我试过将AudioBufferList数据分配给一个常量(我从一个样本运行和AudioBufferList记录中看到它存在一个值),但它似乎什么都不做。

您的第一个问题的答案是肯定的。这通常是如何完成的。

我相信你需要直接操纵指针中的数据,而不是重新分配。你可能想看看openframeworks中处理分配缓冲区并将它们传递给回调函数的代码:https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxiPhone/src/sound/ofxiPhoneSoundStream.mm

还有其他的代码可以查看,nick collins有一个基本的应用程序可以让声音关闭麦克风和扬声器,惠斯特处理之间:http://www.cogs.susx.ac.uk/users/nc81/code.html。他还有一些代码,可以从iPod轨道中获取可能对您有用的样本缓冲区。

+1

任何寻找github链接的人,现在该代码已移至: https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxiPhone/src/sound/ofxiPhoneSoundStream.mm – 2013-02-14 07:16:24

的确,您无法将自己的自定义AudioUnits添加到iPhone。

它的工作方式是这样的:扬声器通过系统驱动数据的拉链。您已经完成了向ioUnit添加呈现回调。

回调运行每当扬声器(总线#0)是饿了,这是你的工作,以填补因为许多样品中,因为它已经要求,在扬声器提供了缓冲。所提供缓冲区的大小为2的幂,尽可能接近您在配置AudioSession时指定的首选IO缓冲区持续时间。

做到这一点的最简单的方法就是把你给予的AudioBufferList并把它传递给AudioUnitRender的麦克风(总线#1)。您在渲染()缓冲区填满后,但回调返回之前,你可以操纵数据你喜欢的任何方式。例如,AurioTouch将其调零以使其静音。

要记住的重要一点是,扬声器会从它通过你的实际数据缓冲区中读取。它不会查看AudioBufferList描述符并检查是否指向另一个databuffer。如果您开始更改您提供的AudioBufferList,则会遇到问题。充其量,你会被忽略。最糟糕的是,你会遇到内存管理问题。

如果您不想被限制为只能在ioData缓冲区中工作,那么您可以使用您自己的AudioBufferList,以任意大小的任意方式进行分配,然后让麦克风将Render()放入该中。然后,只要最终将结果复制到回调提供的缓冲区(即ioData-> mBuffers [0] .mData,就像调用回调时那样),您就可以完成所有您喜欢的操作。