我一直在玩Apple的aurioTouch演示,这是他们的音频单元教程的示例代码。该应用程序允许从麦克风同时输入/输出。发言者。它还呈现来自麦克风的输入声音的立体图。
在这个低级别进程的高级别中,示例代码定义了一个AudioComponent(在本例中为RemoteIO,允许同时输入/输出),并且该音频单元有一个渲染回调。在回调中,他们根据来自麦克风的AudioBuffer声音数据进行一些音频过滤(DC拒绝过滤器)和立体图的可视化。
我的最终目标是根据麦克风的输入创建我自己的自定义声音失真音频单元。我认为基于音频单元教程的正确方法是制作第二个音频单元并将它们与音频处理图连接起来。但是,我已经读过iOS不允许您注册自己的自定义音频单元。我的问题是:
答案 0 :(得分:4)
你的第一个问题的答案是肯定的。这通常是如何完成的。
我认为你需要直接操纵指针中的数据,而不是重新分配。您可能需要查看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 :(得分:1)
确实,您无法将自己的自定义AudioUnit添加到iPhone。
它的工作方式如下:扬声器通过系统驱动数据的拉链。您已经完成了向ioUnit添加渲染回调。
只要扬声器(总线#0)处于饥饿状态,就会运行回调,并且您需要在扬声器提供的缓冲区中填写所请求的样本数量。提供的缓冲区的大小将是2的幂,尽可能接近您在配置AudioSession时指定的首选IO缓冲区持续时间。
最简单的方法是获取您给出的AudioBufferList并将其传递给麦克风上的AudioUnitRender(总线#1)。使用Render()填充缓冲区后,但在回调返回之前,您可以按照自己喜欢的方式操作数据。例如,AurioTouch将其归零以使其静音。
要记住的重要一点是说话者将从它传递给你的实际数据缓冲区中读取。它不会查看AudioBufferList描述符并检查是否指向另一个数据缓冲区。如果您开始更改您给出的AudioBufferList,您将遇到问题。充其量,你会被忽略。在最坏的情况下,您将遇到内存管理问题。
如果您不想被限制在ioData缓冲区中工作,那么您可以使用自己的AudioBufferList,以任何方式分配任意大小,并要求麦克风将Render()放入其中。然后你可以做你喜欢的所有操作,只要最后你将结果复制到回调提供的缓冲区中(即ioData-> mBuffers [0] .mData,就像调用Callback时那样)。