ACX 设备枚举
本主题讨论 ACX 设备枚举、启动和关闭以及设备重新平衡。 有关 ACX 的一般概述,请参阅 ACX 音频类扩展概述。 有关 ACX 电源管理和 PnP 的信息,请参阅 ACX 电源管理。
静态音频设备的 ACX 设备枚举和启动
若要了解 ACX 启动的工作原理,应介绍以下方案。
- 音频设备由单个线路表示。
- 音频/线路生存期与 PnP 设备生存期相关联。
- 单个设备可以为不同的音频设备创建多个线路。
- KMDF 内核模式环境。
启动顺序为:
WDM DriverEntry。 驱动程序范围。 WDF 驱动程序例程的 DriverEntry
- 初始化跟踪。
- (可选)注册卸载。
- 创建 WDFDRIVER。
- 调用 ACX 以执行任何后驱动程序初始化。
- (可选)执行任何后驱动程序初始化。
WDF DeviceAdd。 设备范围。 EVT_WDF_DRIVER_DEVICE_ADD 回调函数
- 调用 ACX 以初始化设备 init 上下文 -
ACX_DEVICEINIT_CONFIG_INIT(&devInitCfg)
ACX_DEVICEINIT_CONFIG_INIT函数 - 注册 WDF PnP 电源回调 -
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
- 使用 AcxDeviceInitialize 创建设备
- 调用 ACX 以执行任何后设备初始化。
- (可选)执行任何后设备初始化。
- 调用 ACX 以初始化设备 init 上下文 -
WDF PrepareHardware。 设备范围。 EVT_WDF_DEVICE_PREPARE_HARDWARE 回调函数。
创建和初始化硬件资源(对于中断和线程,请将其注册到 ACX)。
创建一个或多个线路(一次性创建)。
- 创建 AcxCircuitInit 上下文。
- 添加回调。
- 创建 AcxCircuit。
- (可选)执行任何后线路初始化。
- 向 AcxDeviceAddCircuitDevice 注册线路。
WDF 设备 D0 条目回调。 设备范围。 EVT_WDF_DEVICE_D0_ENTRY 回调函数。
ACX 会在所有线路上调用 EvtAcxCircuitPowerUp 回调。 线路范围。
ACX 会在设备关闭之前将流(如果有)移到其以前的状态。 流实例范围。
WDF 队列将重启。
EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART 回调函数。 设备范围。 - 每次从 Dx 启动后初始化。
ACX 流添加
- ACX 线路上的 ACX 流添加(实例)(ACX 线路上的 ACX 回调)- 在调用 WDF 自管理 I/O 初始化或重启且设备处于 D0 后随时调用。 线路范围。
- 输入:AcxStreamInit 上下文、ACXCIRCUIT。
- 添加回调。
- 创建 AcxStream(实例)。
- (可选)执行任何后流实例初始化。
- 返回时,ACX 会激活此流实例,由于在此方案中是唯一的音频路径上的流实例,因此允许流消息经过。
动态音频设备的 ACX 设备枚举和启动
在此方案中,假定了以下项。
- 动态音频支持(在运行时创建/删除音频设备)。
- 设备生存期与线路生存期无关。
- 单个设备可以为不同的音频设备创建多个线路。
- 上述简单静态模式上的 Piggyback,方法是仅添加特定于动态模式的元素。
- 利用子原始 PDO。
- KMDF 内核模式环境。
此方案的启动顺序为:
WDM DriverEntry。 驱动程序范围。
- 初始化跟踪。
- (可选)注册卸载。
- 创建 WDFDRIVER。
- 调用 ACX 以执行任何后驱动程序初始化。
- (可选)执行任何后驱动程序初始化。
WDF DeviceAdd。 设备范围。
- 调用 ACX 以初始化设备初始化上下文。
- 创建设备。
- 调用 ACX 以执行任何后设备初始化。
- (可选)执行任何后设备初始化。
WDF PrepareHardware。 设备范围。
- 创建和初始化硬件资源(对于中断和线程,请将其注册到 ACX)。
WDF 设备 D0 条目回调。 设备范围。
WDF 队列将重启。
WDF DeviceSelfManagedIoInit。 设备范围。
WDF DeviceSelfManagedIoRestart。 设备范围。
- 每次从 Dx 启动后初始化。
线路动态创建(随时)
- 驱动程序会调用 WdfPdoInitAllocate 来分配 WDFDEVICE_INIT 结构。 驱动程序负责调用 WdfDeviceInitFree(如果在成功创建设备之前遇到任何故障)。
- 驱动程序指定要接收的任何 PnP/电源回调。
- 驱动程序创建设备。
- 驱动程序会调用 AcxDeviceAddCircuitDevice 来实例化新设备/线路。
- WDF/PnP 会接管并将进行上一部分中所述的简单枚举/启动模式。
AcxFactoryCircuit
ACX 驱动程序还可以使用 AcxFactoryCircuitCreate 函数和 AcxDeviceAddFactoryCircuit 函数在电源开启序列期间创建 AcxFactoryCircuit 对象(线路提供程序)。
由于 ACX 驱动程序在 ACX 中将自己作为线路工厂,ACX 框架使用已注册工厂要求驱动程序创建新线路。
AcxFactoryCircuitCreate(Device, &attributes, &factoryInit, &factory);
AcxDeviceAddFactoryCircuit(Device, factory);
ACX 设备重新平衡
当系统资源使用情况要求操作系统在设备之间重新平衡资源时,可以重新平衡。 有关重新平衡的一般信息,请参阅为 PortCls 音频驱动程序实现 PnP 重新平衡。
ACX 支持设备重新平衡,具体如下:
在电源关闭 WDF/ACX 序列中,驱动程序会释放所有流式处理资源(EvtAcxStreamPowerDown、EvtAcxStreamReleaseHardware)、线路资源(EvtAcxCircuitPowerDown、EvtAcxCircuitReleaseHardware)和设备资源 (EvtDeviceReleaseHardware)。
所有请求都会挂起,并且句柄保持打开状态。
在电源开启 WDF/ACX 序列中,驱动程序可确保新资源与当前资源兼容,并且会对其设置进行任何允许的调整。 如果资源与当前设备/线路初始化不兼容,驱动程序必须删除当前线路并创建新的线路。 有关详细信息,请参阅下文。
在电源开启序列中,WDF 会调用其 EvtDevicePrepareHardware 和 EvtDeviceD0 条目,而 ACX 会调用相应的 EvtAcxCircuitPrepareHardware 和 EvtAcxCircuitPowerUp,并将所有流移到其预先存在的状态。
一旦队列移到电源开启/运行状态,I/O 就会再次流动。
如果存在处于活动 (RUN) 状态的流,ACX 不允许删除(使得查询删除失败)或重新平衡(使得查询停止失败)。
驱动程序还可以选择在重新平衡时始终销毁和重新创建音频设备。 当设备检测到新设置与旧设置不兼容时,情况与上述方案相同。 必须在 EvtDevicePrepareHardware/EvtDeviceReleaseHardware 回调中删除线路,并在 EvtDevicePrepareHardware 中重新创建新线路。 驱动程序可注销线路来删除线路(使用 AcxDeviceRemoveCircuit)。
用户模式文件句柄
在重新创建新线路之前,ACX 不会等待关闭用户模式文件句柄。 文件系统句柄的生存期与设备/线路使用的硬件资源的生存期无关。 客户端负责侦听接口到达/删除,以及关闭和重新打开文件句柄。
旧文件句柄标记为已过时,ACX 会使得与其关联的所有 I/O 请求都失败。