OSX:AudioUnit 回调没有被足够的调用

Posted

技术标签:

【中文标题】OSX:AudioUnit 回调没有被足够的调用【英文标题】:OSX: AudioUnit callback not being called enough 【发布时间】:2017-02-12 20:48:49 【问题描述】:

我有一个简单的应用程序,它可以记录音频并处理传入的字节。我发现我丢失了很多应该传入的数据,比如 2/3 .

这个套路:

static OSStatus AudioCallBack (void* userData, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 nFrames, AudioBufferList* ioData)

没有被足够的调用。什么通常会导致这种情况?

【问题讨论】:

【参考方案1】:

如果您尝试在音频单元回调(或任何其他执行 Objective C 消息传递、同步、锁定或内存管理等的操作)中进行任何大量处理,您的回调函数或块可能需要太长时间,因此您的应用程序可能会错过一些回调,从而错过一些音频数据。您可以通过删除回调中的所有处理来检查这一点,只需汇总接收到的音频样本数以确保每秒传入的数量正确。

如果发生这种情况,那么,为了防止您的回调阻塞太久,您应该重新安排您的处理以在另一个线程中完成全部或大部分处理,然后快速将音频单元回调中的数据复制到一个数组中、队列或 fifo 以传递给其他处理任务或线程。由于您知道音频回调的速率,因此您可以确定正确的速率以轮询所需的处理。

【讨论】:

是的,这就是问题所在。谢谢!

以上是关于OSX:AudioUnit 回调没有被足够的调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 MIDI 键盘 OSX 控制 AudioUnit

MacOS Catalina 10.15.7 AudioUnit 麦克风通知回调未调用

OsX 中 USB HID API 的回调永远不会被游戏手柄或其他任何东西调用

在 AudioUnit 播放回调中从 AudioBuffer->mdata 播放音频

AVAudioUnit(渲染)回调

将 AudioUnit 回调与 NSOutputStream 同步