ACX 目标和驱动程序同步

本主题提供音频类 eXtensions (ACX) 目标和驱动程序同步的摘要。

有关 ACX 的一般信息,请参阅 ACX 音频类扩展概述ACX 对象摘要。 有关 IRP 的信息,请参阅 ACX IO 请求数据包 IRP

ACX 目标

ACX 使用 WdfIoTarget 促进 ACX 对象、线路、引脚、流、元素和线路工厂之间的通信。 WdfIoTarget 是一种现有的 WDF 抽象,可促进两个不同的堆栈之间的通信。

驱动程序使用 AcxTargetCircuit 与其他堆栈公开的远程线路通信。 AcxTargetCircuit 是使用 WdfIoTarget 实现的。

驱动程序使用 AcxTargetPin 与其他堆栈公开的远程线路引脚通信。 AcxTargetPin 是使用 WdfIoTarget 实现的,用于将消息发送到远程引脚实体。

驱动程序使用 AcxTargetStream 与其他堆栈公开的远程线路流通信。 AcxTargetStream 是使用 WdfIoTarget 实现的,用于创建远程流并更改远程流的状态。

驱动程序使用 AcxTargetElement 与其他堆栈公开的远程线路元素通信。 AcxTargetElement 是使用 WdfIoTarget 实现的,用于将消息发送到远程元素实体。

驱动程序使用 AcxTargetFactoryCircuit 与远程线路工厂实例通信。 AcxTargetFactoryCircuit 是使用 WdfTarget 实现的,用于将消息发送到远程线路工厂。

若要与远程线路交互,上面列出的每个 ACX 类型都应支持:

  • properties
  • 方法
  • 活动

所有这些类型都是利用 WdfIoTarget 对象类型生成的。

此图显示了 ACX 目标体系结构,以及从 WDF 驱动程序和设备对象的继承。

说明使用 WDFDRIVER、WDFDEVICE、ACXTARGET、ACXSTREAM、ACXSTREAMFACTORY、ACXTARGETELEMENT 和 ACXTARGETPIN 的 ACX 目标体系结构的关系图。

ACX 驱动程序同步和序列化

术语同步是一个常规术语,用于引用在多个并发客户端之间共享资源(内存、I/O 等)所需的操作。

术语序列化用于引用一种类型的对象(I/O 请求、回调等)的一种类型的同步。

ACX 驱动程序是 WDF 驱动程序,这意味着 ACX 驱动程序的同步基于 WDF 的同步功能:

  • 引用计数和分层对象模型的使用。
  • I/O 队列的驱动程序可配置流控制。
  • 设备对象和 I/O 队列的对象呈现锁定。
  • 即插即用和电源回调的自动序列化。

有关同步和序列化的深入描述,请参阅使用自动同步。 有关更完整的说明,请参阅使用 Windows Driver Foundation 开发驱动程序 Microsoft Press 书籍。

WDF 支持以下同步范围:

  • 无范围(KMDF 中的默认值)。
  • 设备范围,WDF 获取设备对象呈现锁定来序列化操作。

默认 ACX 队列是无锁定的被动串行队列。 驱动程序必须先完成 I/O 操作,才能交付下一个操作。

ACX 不支持队列范围选项。 使用此选项,驱动程序可在特定队列上序列化 I/O。 不同的队列可能具有不同的同步范围。

ACX 不支持设备范围序列化。 默认情况下,ACX 使用没有锁定的串行 I/O 队列序列化请求。 每个线路和流对象都有自己的专用队列。 有关流式处理 I/O 的详细信息,请参阅“ACX 流式处理”主题。

如果驱动程序保留了锁定,则它绝不应在释放锁定之前在其控制之外(显式或隐式)调用代码。

对于历史引用,原始 PortCls 使用同步范围(如 WDF 设备范围同步),其中在此设备上创建的任何音频子设备的所有 I/O 都会经历相同的序列化锁定。 这种类型的序列化以前是且现在仍然是各种故障的原因。 在更高版本的 Windows 10(版本 1511 - TH2)中,PortCls 已更新为对流位置 I/O 请求使用不同的锁定。

另请参阅

ACX 音频类扩展概述

ACX 对象摘要

ACX 版本信息

ACX 参考文档

ACX 多堆栈跨驱动程序通信