【问题标题】:AudioUnitRender hang on AUSamplerAudioUnitRender 挂在 AUSampler
【发布时间】:2017-05-11 16:23:02
【问题描述】:

我有一个音乐制作应用程序,它使用 AUSampler 和 AURemoteIO 单元来播放用户定义的音符。我遇到了一个问题,在使用后,对采样器上的 AudioUnitRender 的调用永远不会返回,挂起音频线程并使音频输出静音。此时 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)。

是否有人对为什么会发生这种情况以及如何避免它有建议?

【问题讨论】:

  • 您是从远程输入回调中调用 audiounitrender 吗?如果是这样,也许您可​​以显示一些代码。另外,如果不需要使用回调并手动调用 audiounitrender,请考虑只建立一​​个 audiounit 连接。
  • 它是从 remoteIO 音频单元的渲染回调中调用的。我正在使用一个名为 The Amazing Audio Engine 2 的库,它正在处理实际的回调设置和渲染,但对 AudioUnitRender 的调用是在 line 163

标签: ios core-audio audiounit hal


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多