繁体   English   中英

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

[英]Core Audio (WASAPI) buffer event timing

我正在使用 Windows 核心音频功能(主要是 WASAPI)来渲染专有 stream,遵循 Exclusive-Mode Streams 中的示例。

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

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

您应该有两个线程。 在主线程中,进行所有音频处理和计算,然后将结果传递到辅助线程。 辅助线程的工作仅是等待WASAPI事件并将主线程的乘积写出到声卡。 写出音频的线程应该不进行音频处理。

看来您将共享模式设置为共享非独占,在独占模式下,当一个缓冲区完成时,您将获得两个大小相同的缓冲区,发出事件信号并返回相同大小的第二个缓冲区

但是,如果您将共享模式设置为共享,则只会为您提供一个缓冲区,帮助页面 IAudioClient::GetDevicePeriod 方法对此进行了说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM