【问题标题】:Mic and Speaker Feedback麦克风和扬声器反馈
【发布时间】:2011-11-21 07:46:53
【问题描述】:

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

不幸的是,在不同的时间,信号实际上会反馈并从扬声器发出 - 响亮且有点相位。我没有从麦克风到扬声器建立任何连接 - 但它会产生麦克风以某种方式“打开”的错觉。这不是一个直接的信号 - 它被切碎了,需要你在它发生之前发出一些响亮的声音。

我担心这与 CPU 过载或其他问题有关。我认为回调没有落后。如果我将调试语句放入回调中,当我关闭音频单元时它们似乎停止了......这带来了另一个奇怪之处。在某些时候,即使音频单元已停止,从麦克风到扬声器的反馈仍会继续发生,因此必须关闭应用程序并将其从后台处理队列中删除,然后才能停止不间断的噪音。

奇怪的是,这种情况并非每次都发生在每个测试人员身上,但它确实经常发生,足以引起轰动。

【问题讨论】:

    标签: iphone ios ipad core-audio


    【解决方案1】:

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

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

    如果您的应用能够以某种方式检测到它无法跟上,它应该停止 RemoteIO 音频单元 (AudioOutputUnitStop)。

    在完成每个记录缓冲区之后,在退出每个记录回调之前尝试将数据归零。有报道称,这可能有助于修复一些非常旧的 iPhoneOS 版本中的错误。

    【讨论】:

    • 我认为你一针见血。我减少了处理,反馈消失了。要“自我”检测我是否落后 - 我想我想查看 inTimeStamp 并且知道有多少样本刚刚进入,执行一些数学运算以确保回调之间的时间不是以某种方式增长或持续超过应有的时间。我连接到总线 1(麦克风)并且只是将音频渲染到本地静态缓冲区,所以我不确定这里是否有任何东西可以让我真正归零......但如果/何时会记住这一点我开始使用 ioData 缓冲区。
    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多