HD 音频 DDI 版本之间的差异
HD 音频 DDI 提供三个略有不同的版本,它们的定义如下所示:
HD 音频 DDI 的基准版本,由 HDAUDIO_BUS_INTERFACE 结构定义。 音频和调制解调器编解码器的大多数函数驱动程序只需要此 DDI 版本提供的功能。 此版本通过 Windows XP 和 Windows Vista 附带的 HD 音频总线驱动程序提供。
由 HDAUDIO_BUS_INTERFACE_V2 结构定义的 HD 音频 DDI 的增强版本。 此版本的 DDI 提供了灵活地支持 DMA 驱动的事件通知所需的附加功能。 它在 Windows Vista 及更高版本的 Windows 中可用。
由 HDAUDIO_BUS_INTERFACE_BDL 结构定义的 HD 音频 DDI 的经过修改的版本。 此版本满足相对较少的音频和调制解调器驱动程序的要求,这些驱动程序必须对 DMA 操作的缓冲区描述符列表 (BDL) 的设置进行额外的控制。 此版本的 DDI 适用于 Windows XP 和更高版本的 Windows。 但是,请改用 HDAUDIO_BUS_INTERFACE 或 HDAUDIO_BUS_INTERFACE_V2 DDI 版本。 。
在所有三个结构中,前五个成员的名称和类型与 INTERFACE 结构的五个成员的名称和类型匹配。 有关这些成员的值的信息,请参阅获取 HDAUDIO_BUS_INTERFACE DDI 对象、获取 HDAUDIO_BUS_INTERFACE_V2 DDI 对象或获取 HDAUDIO_BUS_INTERFACE_BDL DDI 对象。
HD 音频 DDI 的三个版本中的例程会执行以下任务:
将命令传输到编解码器并检索对这些命令的响应。
分配并设置 DMA 引擎以在呈现和捕获流中传输数据。
将一个或多个 DMA 引擎的流状态更改为正在运行、已暂停、已停止或重置。
保留用于呈现和捕获流的链接带宽。
提供对挂钟寄存器和链接位置寄存器的直接访问。
通知客户端来自编解码器的未经请求的响应。
注册内核事件,以便它们可以接收 DMA 进度通知。
DDI 的 HDAUDIO_BUS_INTERFACE 和 HDAUDIO_BUS_INTERFACE_BDL 版本具有以下差异:
HDAUDIO_BUS_INTERFACE 结构定义了两个例程:AllocateDmaBuffer 和 FreeDmaBuffer,这些例程不在 HDAUDIO_BUS_INTERFACE_BDL 中。
HDAUDIO_BUS_INTERFACE_BDL 结构定义了三个例程:SetupDmaEngineWithBdl、AllocateContiguousDmaBuffer 和 FreeContiguousDmaBuffer,这些例程不在 HDAUDIO_BUS_INTERFACE 中。
当客户端在第一个 DDI 版本中调用 AllocateDmaBuffer 例程时,HD 音频总线驱动程序:
分配 DMA 缓冲区和 BDL 供 DMA 引擎使用。
初始化 BDL。
设置 DMA 引擎以使用缓冲区和 BDL。
相比之下,第二个 DDI 版本中的 AllocateContiguousDmaBuffer 例程为 DMA 缓冲区和 BDL 分配存储,但依赖于调用方来初始化 BDL。 SetupDmaEngineWithBdl 例程会设置 DMA 引擎以使用缓冲区和调用方初始化的 BDL。
BDL 包含 DMA 引擎的分散/集中队列中物理内存块的列表。 通过调用 SetupDmaEngineWithBdl 以设置 BDL,客户端可以指定数据流中 DMA 引擎生成中断的点。 客户端通过在所选 BDL 条目中设置完成后中断 (IOC) 位来执行此操作。 借助此功能,客户端可以精确控制在处理音频流期间发生的 IOC 中断的计时。 音频调制解调器驱动程序还使用第二个 DDI 版本来获取准确的系统时钟信息。
有关详细信息,请参阅 Intel 高清音频规范。
但是,几乎所有客户端都将使用 DDI 的 HDAUDIO_BUS_INTERFACE 版本。 只有少数需要精确控制中断计时的客户端才会使用 HDAUDIO_BUS_INTERFACE_BDL 版本。