了解 WaveRT 端口驱动程序
WaveRT 端口驱动程序将以前的 WaveCyclic 端口驱动程序的简单性与 WavePci 端口驱动程序的硬件加速性能相结合。
WaveRT 端口驱动程序无需通过向主客户端(通常是音频引擎)提供对数据缓冲区的直接访问,来持续映射和复制音频数据。 这种直接访问也不需要驱动程序操作音频流中的数据。 因此,WaveRT 端口驱动程序满足某些音频设备具有的直接内存访问 (DMA) 制器的需求。
为了将自身与其他波形呈现和波形捕获设备区分开来,除了 KSCATEGORY_AUDIO、KSCATEGORY_RENDER 和 KSCATEGORY_CAPTURE 之外,WaveRT 端口驱动程序还会在 KSCATEGORY_REALTIME 下自注册。 此自注册发生在适配器驱动程序的安装过程中。
在 Windows Vista 及更高版本的操作系统中,当操作系统启动并初始化音频引擎时,音频引擎会枚举表示音频设备的 KS 筛选器。 在枚举期间,音频引擎会实例化找到的音频设备的驱动程序。 此过程会导致为这些设备创建筛选器对象。 对于 WaveRT 音频设备,生成的筛选器对象具有以下组件:
用于管理筛选器的通用系统函数的 WaveRT 端口驱动程序的实例
WaveRT 微型端口驱动程序的实例,用于处理筛选器的所有特定于硬件的功能
创建筛选器对象后,音频引擎和 WaveRT 微型端口驱动程序即可打开音频流,以便执行所需类型的音频处理。 例如,若要为音频呈现(播放)准备 KS 筛选器,音频引擎和 WaveRT 微型端口驱动程序执行以下操作来打开播放流:
音频引擎在 KS 筛选器上打开一个引脚,WaveRT 微型端口驱动程序将创建引脚的实例。 当音频引擎打开引脚时,它还会将流的波次格式传递给驱动程序。 驱动程序使用波次格式信息在下一步中选择适当的缓冲区大小。
音频引擎将请求发送到微型端口驱动程序,以获取要创建的特定大小的循环缓冲区。 术语循环缓冲区是指当缓冲区位置寄存器在播放或录制操作中到达缓冲区末尾时,位置寄存器可以自动环绕到缓冲区的开头。 与设置连续物理内存块的 WaveCyclic 微型端口驱动程序不同,WaveRT 微型端口驱动程序不需要在物理内存中连续的缓冲区。 驱动程序使用 KSPROPERTY_RTAUDIO_BUFFER 属性为缓冲区分配空间。 如果音频设备的硬件无法从请求大小的缓冲区进行流式传输,驱动程序可在音频设备的资源限制内工作,以创建一个缓冲区,该缓冲区的大小最接近最初请求的大小。 然后,驱动程序将缓冲区映射到音频设备的 DMA 引擎,并使缓冲区在用户模式下可供音频引擎访问。
音频引擎计划线程定期将音频数据写入循环缓冲区。
如果音频设备的硬件不直接支持循环缓冲区,微型端口驱动程序会定期对音频设备重新编程,以继续使用同一缓冲区。 例如,如果硬件不支持缓冲区循环,驱动程序必须在每次到达缓冲区末尾时将 DMA 地址设置回缓冲区的开头。 可以在中断服务例程 (ISR) 或高优先级线程中完成此更新。
生成的配置在支持循环缓冲区的音频设备硬件上提供故障复原音频信号,或者与微型端口驱动程序一起定期更新其硬件。
若要为音频捕获(录制)准备 KS 筛选器,音频引擎和 WaveRT 微型端口驱动程序将使用类似的步骤打开录制流。
WaveRT 端口驱动程序提供的性能改进之一是,在波次呈现或波形捕获期间,音频流的端到端处理延迟减少。 此延迟称为流延迟。
有关这两种类型的流延迟的详细信息,请参阅以下主题。
有关如何开发与 WaveRT 端口驱动程序相补充的 WaveRT 微型端口驱动程序的信息,请参阅开发 WaveRT 微型端口驱动程序主题。