Iphone 麦克风和扬声器反馈

Iphone 麦克风和扬声器反馈,iphone,ios,ipad,core-audio,Iphone,Ios,Ipad,Core Audio,我有一个使用核心音频单元的iPad应用程序(调谐器)。它从麦克风读取信号并进行处理。它不会向扬声器发出回声 不幸的是,在不同的时间,信号实际上会反馈并从扬声器中发出——声音很大,有点像相位。我还没有将麦克风与扬声器连接起来,但这会产生一种错觉,认为麦克风不知怎么地“开着”。这不是一个直接的信号——它是被切碎的,需要你在它发生之前发出一些响亮的声音 我担心这与cpu过载有关。我不认为回拨会落后。如果我将调试语句放入回调,当我关闭音频单元时,它们似乎停止了。。。这带来了另一个奇怪的现象。在某些时候,

我有一个使用核心音频单元的iPad应用程序(调谐器)。它从麦克风读取信号并进行处理。它不会向扬声器发出回声

不幸的是,在不同的时间,信号实际上会反馈并从扬声器中发出——声音很大,有点像相位。我还没有将麦克风与扬声器连接起来,但这会产生一种错觉,认为麦克风不知怎么地“开着”。这不是一个直接的信号——它是被切碎的,需要你在它发生之前发出一些响亮的声音

我担心这与cpu过载有关。我不认为回拨会落后。如果我将调试语句放入回调,当我关闭音频单元时,它们似乎停止了。。。这带来了另一个奇怪的现象。在某些时候,即使音频单元已经停止,从麦克风到扬声器的反馈仍会持续出现,因此在持续的噪音停止之前,应用程序必须关闭并从后台处理队列中删除


奇怪的是,这种情况并不是每次都会发生,每个测试人员都会遇到,但这种情况的发生频率足以引起轰动。

如果你的RemoteIO回调太慢和/或你的应用程序崩溃并停止处理音频回调,RemoteIO音频缓冲区可能会被回收,这可能会导致一些旧的播放缓冲区,甚至可能是录制缓冲区,以在下流音频通道中重复或重复结束。测试这一点的一种方法是注释掉回调中的所有处理代码(和调试打印,也可能太慢),看看这是否解决了“反馈”问题

尝试在RemoteIO录制和播放回调中只执行简单的缓冲区拷贝和/或其他低开销快速处理。不要在远程回调内部处理数据,而是在回调外部握手、安排或排队等待稍后要完成的工作

如果您的应用程序检测到无法跟上,则应停止RemoteIO音频单元(AudioOutputUnitStop)


在退出每个记录回调之前,还可以尝试在处理完每个记录缓冲区后将其归零。有报道称,这可能有助于修复一些非常旧版本的iPhone操作系统中的错误。

我认为你说得一针见血。我减少了处理,反馈消失了。为了“自我”检测我是否落后——我想我应该看看初始阶段,知道有多少样本刚刚进来,进行一点计算,以确保回调之间的时间不会以某种方式增长或持续地超过应有的时间。我连接到总线1(麦克风),只是将音频渲染到本地静态缓冲区,所以我不确定这里是否有任何东西可以让我实际归零。。。但如果/当我开始使用ioData缓冲区时,请记住这一点。