AudioUnitRender 挂在 AUSampler 上

AudioUnitRender hang on AUSampler

我有一个音乐制作应用程序,它使用 AUSampler 和 AURemoteIO 单元来播放用户定义的音符。我遇到一个问题,在一些使用之后,对采样器上的 AudioUnitRender 的调用从未 returns,挂起音频线程并使音频输出静音。 CPU 用法也在这一点上飙升,因为音频线程不断向设备控制台(不是调试器输出)吐出错误消息:

May 11 11:45:12 <device name> mediaserverd(CoreAudio)[2296] <Notice>: HALS_IOContext.cpp:1496:IOWorkLoop_HandleOverload: HALS_IOContext::IOWorkLoop_HandleOverload: Overload on context 96 current time: 11788974 deadline: 11788958

此消息由 _os_log_impl 在 AUSampler 渲染器中记录(特别是 VoiceEnvelope::GetRunFrameCount)。

有没有人对为什么会发生这种情况以及如何避免提出建议?

我发现了这个问题。我将大于缓冲区大小的偏移量传递给 MusicDeviceMIDIEvent,这会导致问题。这是由于提供给渲染回调的时间戳偶尔跳转而发生的。我能够通过检查并忽略偏移量大于当前回调的帧数的事件来解决问题。