WaveCyclic 延迟

如果 WaveCyclic 微型端口驱动程序提供音频播放流的硬件混合,DirectSound 会将 IRP 提交到 WaveCyclic 端口驱动程序,该驱动程序包含单个循环缓冲区中的整个 DirectSound 波次流。 WaveCyclic 端口驱动程序会接收 IRP,并将波次数据逐条馈送到驱动程序公开的 DMA 缓冲区中。 WaveCyclic 会尝试在读取指针之前,将 DMA 缓冲区的写入指针保留大约 40 毫秒。 即使驱动程序正使用 DirectSound 进行硬件混合,也可能需要 DMA 缓冲区中大约 40 毫秒的额外数据。

WaveCyclic 端口驱动程序会尝试在循环缓冲区中累积多达 40 毫秒的数据,但这并不意味着 WaveCyclic 端口驱动程序会将 40 毫秒添加到流的延迟。 事实上,端口驱动程序增加的延迟非常少。 就在新流开始播放之前,端口驱动程序仍在将初始数据写入循环缓冲区的开头,端口驱动程序将继续写入,直到没有更多数据可用,或者缓冲区包含完整的 40 毫秒数据。 但是,如果有少于此数量的数据立即可用,则端口驱动程序不会强制微型端口驱动程序等待。 相反,它允许微型端口驱动程序立即开始播放缓冲的数据。 稍后,随着有更多的数据可用,端口驱动程序会继续将数据写入缓冲区,直到不再有可用数据,或者读取和写入指针之间缓冲的数据量达到 40 毫秒。

在一段时间接近枯竭之后,KMixer 流可以包含静音间隔。 如果 WaveCyclic 只收到来自 KMixer 的足够波次数据,以维护 DMA 缓冲区中的 30 毫秒而不是 40 毫秒的额外数据,WaveCyclic 将开始在 KMixer 的有效数据末尾之后将静音写入 DMA 缓冲区。 此策略可确保,如果出现枯竭,并且设备在有效数据的末尾读取,则音频设备会保持静音,而不是过时或未初始化数据。

写入 DMA 缓冲区的静音量相当少,如果 KMixer 在播放静音之前成功地向 WaveCyclic 端口驱动程序提供附加数据,则数据将覆盖缓冲区中的静音。 在没有枯竭的情况下,音频设备将接收连续的混合数据流,而不会有强制静音间隔。 但是,调试驱动程序时,即使音频呈现器未枯竭,也可能会看到微型端口驱动程序的 IMiniportWaveCyclicStream::Silence 方法被调用。