ACX 设备枚举

本主题讨论 ACX 设备枚举、启动和关闭以及设备重新平衡。 有关 ACX 的一般概述,请参阅 ACX 音频类扩展概述。 有关 ACX 电源管理和 PnP 的信息,请参阅 ACX 电源管理

静态音频设备的 ACX 设备枚举和启动

若要了解 ACX 启动的工作原理,应介绍以下方案。

  • 音频设备由单个线路表示。
  • 音频/线路生存期与 PnP 设备生存期相关联。
  • 单个设备可以为不同的音频设备创建多个线路。
  • KMDF 内核模式环境。

启动顺序为:

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 请求都失败。

另请参阅

ACX 音频类扩展概述

ACX 参考文档

PnP 和电源管理回调序列