WASAPI 音频设备的同步

Posted

技术标签:

【中文标题】WASAPI 音频设备的同步【英文标题】:Synchronization of WASAPI Audio Devices 【发布时间】:2019-07-16 01:47:24 【问题描述】:

WASAPI 有没有办法确定两个设备(输入和输出设备)是否都同步到相同的底层时钟源?

在我看到的所有示例中,输入和输出设备都是分开处理的——通常每个设备使用不同的线程或事件句柄,我没有看到任何关于如何保持两个设备同步(或如何保持同步)的讨论处理不同步的设备)。

对于我的应用程序,我基本上需要对输出处理进行实时输入,在每个音频周期中,我都会获得一定数量的传入样本并发送相同数量的输出样本。即:我需要一个对两个设备都正确的音频周期触发事件 - 而不是每个设备的单独事件。

我还需要了解它在独占模式和共享模式下的工作原理。独家我想这将归结为寻找设备是否有一个共同的时钟源。对于共享模式,有关 Windows 保证设备同步的一些信息会非常有用。

【问题讨论】:

【参考方案1】:

您可以使用IAudioClock API 来检测给定音频客户端相对于 QPC 的漂移;如果两个端点共享一个时钟,它们相对于 QPC 的漂移将是相同的(也就是说,它们相对于彼此的漂移为零。)

您可以使用IAudioClockAdjustment API 来调整您可以检测到的漂移。例如,您可以校正两侧相对于 QPC 的漂移;您可以校正任一侧相对于另一侧的漂移;或者您可以拆分差异并将两侧校正为平均值。

【讨论】:

谢谢马修。这是一个有趣的想法,但要确定两个设备是否具有相同的时钟源似乎是一件复杂的事情。即:如果我正在尝试构建一个 UI 来呈现具有相同时钟源的端点,那么必须启动和监视不同的设备组合似乎有点遥不可及。基本上听起来没有简单的方法可以使用 WASAPI 进行实时输入以输出流,这是不幸的。 :(

以上是关于WASAPI 音频设备的同步的主要内容,如果未能解决你的问题,请参考以下文章

WASAPI 的问题

使用 WASAPI 捕获蓝牙音频数据

尝试使用 Win32 WASAPI C++ 中的“捕获流”创建 wav 文件

如何在 Windows 中从任何格式转换为 PCM

使用 WiFi 在 iOS 设备之间同步音频的最佳方法是啥?

如何处理来自 WASAPI 流的声音数据块而不将它们写入文件?