ACX 线路
本主题讨论 ACX 线路。 有关 ACX 的一般概述和 ACX 术语列表,请参阅 ACX 音频类扩展概述。
如 ACX 对象摘要中所述,AcxCircuit 对象表示用户感知音频设备(扬声器、麦克风等)的部分或完整音频路径。 AcxCircuit 至少有一个输入引脚和一个输出引脚 (ACXPIN),并且可以聚合一个或多个类似 AcxElements 的对象。 线路表示现有终结点及其功能。
ACX 流是创建用于表示线路创建的音频流的驱动程序组件。 流由根据父线路的元素创建的元素列表组成。 流线路是多栈体系结构(部分音频路径)中的线路,该线路直接与上层用户模式流式处理服务进行交互。 核心线路是提供音频终结点设备的标识的多栈体系结构(部分音频路径)中的线路。
ACX 线路标识
每个 ACX 线路都有一个线路标识符。 ACX 定义以下各项:
名称 (str),唯一标识此线路音频设备类型。 它用于查找 INF 的设置,并且是用于从远程设备访问此线路的符号链接的一部分。 示例:“Render0”、“Render1”或“Capture0”。
符号链接。 一个符号链接可与所有公开的线路关联。 客户端使用此符号链接打开与设备/线路的通信路径。
线路的组件 ID (guid)。 唯一标识线路实例(特定于供应商)。 如果指定了线路 URI,则不能在 AcxCircuitTemplate 绑定中使用它。
线路的组件 URI (str)。 唯一标识线路实例(特定于供应商)。 如果指定了线路 ID,则不能在 AcxCircuitTemplate 绑定中使用它。
线路工厂的组件 ID (guid)。 唯一标识线路工厂实例(特定于供应商)。 如果指定了线路工厂 URI,则不能在 AcxCircuitTemplate 绑定中使用它。
线路工厂的组件 URI (str)。 唯一标识线路工厂实例(特定于供应商)。 如果指定了线路工厂 ID,则不能在 AcxCircuitTemplate 绑定中使用它。
AcxCircuitCreate
AcxCircuitCreate 函数用于创建 ACXCIRCUIT。 AcxCircuitCreate 函数使用的不透明 ACXCIRCUIT_INIT 结构。 AcxCircuitInitAllocate 用于初始化 ACXCIRCUIT_INIT 结构。
AcxFactoryCircuit
ACX 驱动程序还可以使用 AcxFactoryCircuitCreate 函数和 AcxDeviceAddFactoryCircuit 函数在电源开启序列期间创建 AcxFactoryCircuit 对象(线路提供程序)。
ACX 线路组合
ACX 将线路绑定在一起,直到它们形成完整音频路径。 ACX 使用音频绑定将音频线路连接在一起。 有关详细信息,请参阅 ACX 多线路组合。
ACX 线路动态创建(随时)
ACX 可以根据需要创建动态线路。 这样,驱动程序会调用 WdfPdoInitAllocate 来分配 WDFDEVICE_INIT 结构。 然后,驱动程序指定它想要接收的任何 PnP/power 回调,并创建设备。 驱动程序会调用 AcxDeviceAddCircuitDevice 来实例化新设备/线路。 有关详细信息,请参阅 ACX 设备枚举。
ACX 线路动态删除
驱动程序会调用 AcxDeviceRemoveCircuitDevice 来从设备列表中删除音频设备。 这会触发 ACX 线路设备/线路实体上的电源关闭序列。 将以异步方式删除线路设备/线路。 有关详细信息,请参阅 ACX 设备枚举。
AcxDeviceRemoveCircuit 和 AcxDeviceDetachCircuit
有两种常用方法可用于管理线路终止。 AcxDeviceDetachCircuit 或 AcxDeviceRemoveCircuit。
如果调用方调用 AcxDeviceDetachCircuit,则不得调用 AcxDeviceRemoveCircuit。 如果调用驱动程序希望在 AcxDeviceDetachCircuit 之后删除线路,则应使用 WdfObjectDelete。
通过调用 AcxDeviceRemoveCircuit,调用驱动程序会指示 ACX 删除此线路并从设备中将其移除/删除。 在这种情况下,无需在线路上调用 WdfObjectDelete。
总之,AcxDeviceDetachCircuit 意味着驱动程序负责管理线路对象生存期,而 AcxDeviceRemoveCircuit 意味着将移除并删除线路。
有关 WDF 对象生存期管理的一般信息,请参阅框架对象生命周期。
AcxDeviceRemoveCircuitDevice
与上述线路终止不同,音频驱动程序会使用 AcxDeviceRemoveCircuitDevice 来删除现有音频终结点,并且可以在驱动程序的生命周期内随时调用。
驱动程序还可以选择在重新平衡时始终销毁和重新创建音频设备。 当设备检测到新设置与旧设置不兼容时,情况与上述方案相同。
必须在 EvtDevicePrepareHardware/EvtDeviceReleaseHardware 回调中删除线路,并在 EvtDevicePrepareHardware 中重新创建新线路。 驱动程序可注销线路来删除线路(使用 AcxDeviceRemoveCircuit)。
EvtAcxCircuitReleaseHardware (EVT_ACX_CIRCUIT_RELEASE_HARDWARE) 回调函数
如果驱动程序已注册 EvtAcxCircuitReleaseHardware 回调函数,则框架会在以下转换期间调用该回调函数:
- 资源重新均衡
- 有序删除
- 意外删除
在 WDF 框架停止向设备发送 I/O 请求后,ACX 框架会调用 EvtAcxCircuitReleaseHardware 回调函数,已禁用和断开连接分配给设备的任何中断,并且已关闭设备。
在 WDF 框架调用驱动程序的 EvtDeviceReleaseHardware 回调函数之前,ACX 框架会调用 EvtAcxCircuitReleaseHardware 回调函数。
当框架调用 EvtAcxCircuitReleaseHardware 时,设备的 PDO 仍然存在,并且可以从中查询设备信息,这些信息在电源关闭状态下可用,例如 PCI 配置状态。
此外,框架提供给 EvtDeviceReleaseHardware 的已转换硬件资源仍分配给设备。 此回调函数的主要用途是释放这些资源,特别是取消映射驱动程序的 EvtAcxCircuitPrepareHardware 回调函数映射的任何内存资源。 驱动程序还可以使用此回调来执行可能处于关机状态时需要的任何其他 ACXCIRCUIT 管理活动。 通常,所有其他硬件关闭操作都应在驱动程序的 EvtDeviceD0Exit 回调函数中完成。
如果调用了驱动程序的 EvtAcxCircuitPrepareHardware 回调函数,则除非 EvtAcxCircuitPrepareHardware 返回了失败代码,否则 ACX 框架始终会调用驱动程序的 EvtAcxCircuitReleaseHardware 回调函数。
有关硬件资源的详细信息,请参阅硬件资源简介。
EvtAcxFactoryCircuitReleaseHardware (EVT_ACX_FACTORY_CIRCUIT_RELEASE_HARDWARE) 回调函数
当框架调用 EvtAcxFactoryCircuitReleaseHardware 时,设备的 PDO 仍然存在,并且可以从中查询设备信息,这些信息在电源关闭状态下可用,例如 PCI 配置状态。
此外,框架提供给 EvtDeviceReleaseHardware 的已转换硬件资源仍分配给设备。 此回调函数的主要用途是释放这些资源,特别是取消映射驱动程序的 EvtAcxCircuitPrepareHardware 回调函数映射的任何内存资源。 驱动程序还可以使用此回调来执行可能处于关机状态时需要的任何其他 ACXCIRCUIT 管理活动。 通常,所有其他硬件关闭操作都应在驱动程序的 EvtDeviceD0Exit 回调函数中完成。
如果调用了驱动程序的 EvtAcxFactoryCircuitPrepareHardware 回调函数,则除非 EvtAcxFactoryCircuitPrepareHardware 返回了失败代码,否则 ACX 框架始终会调用驱动程序的 EvtAcxFactoryCircuitReleaseHardware 回调函数。
有关管理 WDF 和线路对象的详细信息,请参阅 ACX WDF 驱动程序生命周期管理。