首页 > 解决方案 > WASAPI 独占模式不规则回调

问题描述

很长一段时间以来,我们已经注意到在独占、事件驱动模式下使用 WASAPI 会导致不规则的回调周期。在不显示每个人都用作基线的“相同旧”代码(Microsoft 示例)的情况下,我们做了以下事情(为简单起见硬编码):

m_AudioClient->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE,
                          AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
                          40000,
                          40000,
                          m_MixFormat,
                          nullptr);

请注意,所有设备报告的最小设备周期为 30000,因此我们可以使用此代码。混音格式只是一个标准的 16 位双通道 PCM 设置,没什么特别的。

这工作正常,并且让我们的回调在我们正常处理音频的地方正常运行。

但是,我们很难真正获得 4 毫秒的延迟。所以我们在渲染回调中放了一些计时代码,注意到回调的平均时间实际上是 4ms,但个别回调时间如下所示(时间略有不同,但这是典型的):

9.867 毫秒 .089 毫秒 9.929 毫秒 .088 毫秒 .090 毫秒 9.803 毫秒 .093 毫秒 9.909 毫秒 .063 毫秒 .069 毫秒。. .

我们原本预计每个呼叫以大约 4 毫秒的间隔到达。问题是,如果我们试图尽可能快地传送音频而不会丢失,我们就无法保持 4ms 的速率。实际上,我们不能真正指望以 10 毫秒左右的速度传输音频,因为有时似乎需要将近 10 毫秒才能触发我们的回调。

使用 AvmSetThreadCharacteristics 或 MFLockSharedWorkQueue 将所有线程设置为“Pro Audio”。

我们已经使用 IAudioClient 和 IAudioClient3 以及来自多个制造商的多个设备(但都是 USB 设备)完成了此操作。

这是与驱动程序相关的问题吗?我们使用的设备是 Realtek USB、Motu M2、Focusrite 18i8、RME Babyface Pro FS 等。他们都表现出这种行为。

标签: windowsaudiowasapi

解决方案


推荐阅读