核心音频(Wasapi)缓冲区事件时机

Core Audio (WASAPI) buffer event timing

本文关键字:缓冲区 事件 时机 Wasapi 音频 核心      更新时间:2023-10-16

我正在使用Windows Core Audio函数(主要是Wasapi)来渲染独家流,按照独家模式流中的示例。

这会创建两个交替的缓冲区,并交替填充。有一个与缓冲区完成有关的事件,可以唤醒线程,以便可以重新填充刚刚完成的缓冲区。GetPosition表明,当电流缓冲区位于160帧缓冲区的框架147时,线程唤醒。这给我留下了13/160的缓冲时间,以获取新的缓冲区,填充并释放它。我有很多计算要做,这还不够。我想我可以在填充缓冲区时保持对处理器的控制,而不是睡觉,但这似乎不是正确的解决方案。

此外,即使我的过程是" Pro Audio",优先级为25,有时缓冲区的完成事件仍会延迟,因此系统开始重播未填充的缓冲区。我还没有发现有关该时间应该如何工作的讨论,或者如何控制它。我希望缓冲区完成事件在少数框架内到达下一个缓冲区。有人熟悉这些东西吗?用解决方案或有关在哪里寻找的线索?

您应该有两个线程。在主线程中,您可以进行所有音频处理和计算,并将结果交付给辅助线程。次要线程的作业仅仅是等待Wasapi事件,并将主线程的产品写入声卡。编写音频的线程不应进行音频处理。

看来,您的共享模式设置为共享非独家,在独家模式下,您会在一个缓冲区完成后获得两个相同大小的缓冲区返回相同的尺寸

但是,如果您将共享模式设置为共享,则只给出一个缓冲区,帮助页面iaudioclient :: getDeviceperiod方法解释了这一点。