Core Audio (WASAPI) 缓冲区事件计时

Posted

技术标签:

【中文标题】Core Audio (WASAPI) 缓冲区事件计时【英文标题】:Core Audio (WASAPI) buffer event timing 【发布时间】:2014-01-26 23:40:56 【问题描述】:

按照 Exclusive-Mode Streams 中的示例,我正在使用 Windows 核心音频函数(主要是 WASAPI)来呈现独占流。

这会创建两个交替播放和填充的缓冲区。有一个与缓冲区完成相关的事件会唤醒线程,以便它可以重新填充刚刚完成的缓冲区。 GETPOSITION 显示当当前缓冲区位于 160 帧缓冲区的第 147 帧时线程被唤醒。这让我有 13/160 的缓冲时间来获取新的缓冲区、填充它并释放它。我有很多计算要做,时间不够。我想我可以在缓冲区被填满时保持对处理器的控制而不是休眠,但这似乎不是正确的解决方案。

此外,即使我的进程是“PRO AUDIO”并且优先级为 25,有时缓冲区完成事件会延迟更远,因此系统开始重播未填充的缓冲区。我还没有找到任何关于这个时间应该如何工作或如何控制的讨论。我预计缓冲区完成事件会在少量帧内到达下一个缓冲区。有人熟悉这个东西吗?是否有解决方案或关于在哪里寻找解决方案的线索?

【问题讨论】:

【参考方案1】:

你应该有两个线程。在主线程中,您完成所有音频处理和计算,并将结果传递给辅助线程。辅助线程的工作只是等待 WASAPI 事件并将主线程的产品写入声卡。写出音频的线程应该不做音频处理。

【讨论】:

以上是关于Core Audio (WASAPI) 缓冲区事件计时的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC Windows Native音频中的Core Audio API

WebRTC Windows Native音频中的Core Audio API

Core Audio 大(压缩)文件播放和内存占用

WASAPI 在 Windows 上捕获的缓冲区大小

连续 WASAPI 环形缓冲区采样

Core Audio - CARingBuffer 读取音频文件进行回调