开发 WaveRT 微型端口驱动程序

本主题介绍你在决定开发自己的 WaveRT 微型端口驱动程序时必须考虑的软件和硬件相关点。

Microsoft 为通用音频体系结构 (UAA) 开发了一组硬件设计准则,这些准则包含我们建议用于 WaveRT 音频设备的功能。 UAA 准则严格基于 Intel 开发的高清 (HD) 音频规范而制定。

Windows Vista 和更高版本的 Windows 操作系统为符合 UAA 的音频设备提供 HD 音频驱动程序。 因此,如果音频设备符合 UAA,你便无需开发自己的 WaveRT 微型端口驱动程序。 但是,对于具有一些专有的非 UAA 硬件功能的音频设备,你必须开发自己的 WaveRT 微型端口驱动程序来支持专有功能。

为了帮助你开发自己的 WaveRT 微型端口驱动程序,建议先查看示例适配器驱动程序,然后查看 WaveRT 友好的 UAA 功能。

示例适配器驱动程序

有关示例驱动程序的信息,请参阅示例音频驱动程序

WaveRT 友好功能

查看示例适配器驱动程序并开始设计 WaveRT 微型端口驱动程序后,必须验证它是否支持以下软件和硬件功能。 因此,生成的微型端口驱动程序随后与系统提供的 WaveRT 端口驱动程序以及 Windows Vista 音频引擎的操作模式兼容。

  • 硬件延迟低。 WaveRT 微型端口驱动程序必须提供 IMiniportWaveRTStream::GetHWLatency 方法的完全正常运行实现。 需要此方法才能支持 KSPROPERTY_RTAUDIO_HWLATENCY 属性。

  • FIFO 中断。 当发生 FIFO 溢出和欠载时,WaveRT 微型端口驱动程序必须自动生成中断。 借助此功能,你可以在对音频设备和驱动程序软件运行测试时检测音频流中的故障。 如果没有硬件支持(换言之,FIFO 中断),就不存在用于获取故障信息的方便可靠的方法。

  • 分散/集中 DMA 和缓冲区循环。 当微型端口驱动程序支持具有分散/集中功能的 DMA 控制器时,它允许将数据移入和移出循环缓冲区,而无需从微型端口驱动程序进行干预。

    当微型端口驱动程序支持可执行缓冲区循环的 DMA 控制器时,DMA 控制器可以在读写操作到达缓冲区末尾后自动环绕至缓冲区的开头。 它可以执行环绕,而无需微型端口驱动程序的干预。

    请注意,WaveRT 端口驱动程序支持现有的硬件设计,这些设计缺少执行分散/集中传输或自动缓冲区循环的能力。

    如果音频设备缺少分散/集中功能,WaveRT 微型端口驱动程序必须首先分配包含内存中物理连续的页面的循环缓冲区。 然后,微型端口驱动程序使用 WaveRT 端口驱动程序中的帮助程序函数来执行数据传输和自动缓冲循环。 缺点是,当系统的非分页内存池变得越来越碎片化时,分配大块连续物理内存的请求更有可能失败。 具有分散/收集功能的设备不受内存碎片化的影响。

    如果音频设备在 DMA 声道到达循环缓冲区的末尾时无法自动执行缓冲区循环,则 WaveRT 微型端口驱动程序必须进行干预并配置声道,以便开始在缓冲区开头传输数据。

  • 位置寄存器。 对于新设计,硬件实现者应为每个 DMA 声道添加一个位置寄存器。 位置寄存器指示当前缓冲区位置作为循环缓冲区开头的字节偏移量。 位置寄存器读数在缓冲区的开头为零。 当位置寄存器到达循环缓冲区的末尾时,它会自动回绕到缓冲区的开头(重置为零),并在缓冲区位置向前移动时继续递增。

    位置寄存器可以映射到虚拟内存,以便客户端可以直接读取寄存器。

    理想情况下,位置寄存器应指示当前正在音频设备的数模和模数转换器(DAC 和 ADC)中移动的样本的缓冲区位置。

    但是,此信息可能无法直接从音频芯片组获取,该芯片组将数字和模拟函数划分为单独的总线控制器和编码器/解码器(编解码器)芯片。 通常,位置寄存器位于总线控制器芯片中,每个寄存器都指示控制器正在写入或读取编解码器的音频数据的位置。

    从这种类型的位置寄存器获取读数后,客户端可以通过加上或减去通过编解码器的延迟来估计正在通过 DAC 或 ADC 移动的样本的当前位置。 客户端从 KSPROPERTY_RTAUDIO_HWLATENCY 属性请求获取编解码器延迟。 因此,当端口驱动程序调用 IMiniportWaveRTStream::GetHardwareLatency 方法以响应这种类型的属性请求时,WaveRT 微型端口驱动程序必须准确报告编解码器延迟。

    请注意,WaveRT 端口驱动程序支持缺少位置寄存器的现有硬件设计。 对于具有此限制的设备,WaveRT 微型端口驱动程序必须通过返回 STATUS_NOT_SUPPORTED 错误代码而使对 IMiniportWaveRTStream::GetPositionRegister 方法的调用失败,这会强制端口驱动程序使 KSPROPERTY_RTAUDIO_POSITIONREGISTER 属性请求失败。 在这种情况下,客户端必须通过 KSPROPERTY_AUDIO_POSITION 属性获取当前位置,这会在每次读取位置时导致用户模式和内核模式之间的转换开销。

  • 时钟寄存器。 时钟寄存器是与 WaveRT 兼容的音频设备的可选但有用的硬件功能。 音频应用程序程序可以使用时钟寄存器在具有独立和未同步硬件时钟的两个或更多个独立音频设备中同步音频流。 如果没有时钟寄存器,应用程序便无法检测和补偿硬件时钟之间的偏移。

    音频硬件用于通过数模或模数转换器对音频数据计时的示例时钟应派生自递增时钟寄存器的内部时钟。 一个时钟寄存器,该寄存器以与示例时钟异步的速率递增,不可用于同步且不应公开。

    与位置寄存器类似,时钟寄存器可以映射到虚拟内存,以便客户端可以直接读取寄存器。

  • 音频处理对象。 设计良好的 WaveRT 微型端口驱动程序绝不能在音频设备的循环缓冲区中触摸音频数据。 设计硬件时应使音频数据直接在客户端和音频硬件之间流动,而无需音频驱动程序软件干预。

APO 仅适用于共享模式音频流。 对于独占模式流,应用程序通过循环缓冲区直接与 WaveRT 硬件设备交换数据,并且任何其他组件都无法触摸缓冲区中的数据。

有关详细信息,请参阅 Windows 音频处理对象