预提取偏移量

WavePci 微型端口驱动程序调用 IPreFetchOffset::SetPreFetchOffset 方法,以指定硬件加速的 DirectSound 输出流的预提取偏移量。 此偏移量是将写入游标与音频设备硬件缓冲区中的播放游标分隔开来的数据字节数。 写入游标指定 DirectSound 应用程序可以安全地写入下一个声音样本的缓冲区位置。 播放光标指定音频设备当前正在播放的声音样本的缓冲区位置。

DirectSound 通过发送 KSPROPERTY_AUDIO_POSITION 属性请求来查询 WavePci 端口驱动程序,了解播放的当前位置并编写游标。 为了响应此请求,端口驱动程序通过调用 IMiniportWavePciStream::GetPosition 从微型端口驱动程序获取当前播放位置。 端口驱动程序如何确定写入位置取决于是否已调用 SetPreFetchOffset

默认情况下,端口驱动程序将写入游标放置在微型端口驱动程序请求的最后一个映射中。 每次调用 IPortWavePciStream::GetMapping 时,默认预提取偏移量会增大。 如果 WavePci 微型端口驱动程序获取大量映射,则默认偏移量可能会非常大。

调用 SetPreFetchOffset 会替代默认值。 在此调用后,端口驱动程序通过将指定的预提取偏移量添加到播放位置来计算写入位置(考虑到 DirectSound 缓冲区末尾的环绕)。

微型端口驱动程序可能会出于多种原因分配大量映射。 一是减少系统处理器上的音频操作开销。 通过更多的映射,驱动程序需要更少的中断来使音频设备持续提供数据。 另一个原因是,分配更多映射会降低当行为不佳的设备驱动程序在短时间内将系统绑起来时音频播放出现故障的可能性。

大型预提取偏移量的一个问题是,某些 DirectSound 应用程序可能会对播放和写入游标的相对位置感到困惑。 在 Windows 95/98 中,音频 VxD 保持相对较小的预提取偏移量,如果偏移量大于预期,为这些操作系统编写的 DirectSound 应用程序可能无法正常运行。

例如,应用程序可以将 DirectSound 缓冲区划分为上半部分和下半部分,然后“乒乓球”应用程序与设备之间的两半。 当写入游标首次进入缓冲区的上半部分或下半部分时,它会将数据写入该缓冲区的一半。 此方案假定播放游标始终位于缓冲区的另一半,即未写入其中的一半。 请注意,如果预提取偏移量超过缓冲区大小的一半,则此假设不正确。 在这种情况下,当写入游标到达 DirectSound 缓冲区的末尾并环绕到缓冲区的开头时,它将与播放游标位于缓冲区的同一半。 当应用程序将一半缓冲区的数据写入新的写入游标位置时,它最终会覆盖播放游标位置并销毁尚未播放的数据。

尽管应用程序本身当然可以针对此类故障追溯,但 WavePci 微型端口驱动程序只需调用 SetPreFetchOffset 将预提取偏移设置为较小的值即可消除故障模式。

将预提取偏移量设置为较小的值会将生成的写入游标更接近播放游标。 应将预提取偏移量设置为硬件的 FIFO 大小。 典型的预提取偏移量约为 64 个样本,具体取决于 DMA 引擎的硬件设计。

为了与某些较旧的 DirectSound 应用程序保持兼容,DirectSound 当前将硬件加速引脚的写入游标填充 10 毫秒。 请注意,填充量将来可能会更改。

有关在驱动程序级别管理写入游标和播放游标的其他信息,请参阅 音频位置属性