ACX 线路

本主题讨论 ACX 线路。 有关 ACX 的一般概述和 ACX 术语列表,请参阅 ACX 音频类扩展概述

ACX 对象的摘要中所述,AcxCircuit 对象表示用户感知音频设备(扬声器、麦克风等)的部分或完整音频路径。 AcxCircuit 至少有一个输入引脚和一个输出引脚(ACXPIN),它可以聚合一个或多个 AcxElements(如对象)。 线路表示现有终结点及其功能。

ACX Stream 是用于表示线路创建的音频流的驱动程序组件。 流由根据父电路的元素创建的元素列表组成。 流线路是多堆栈体系结构(部分音频路径)中的线路,可直接与上层用户模式流式处理服务进行交互。 核心线路是多堆栈体系结构(部分音频路径)中的线路,它提供音频终结点设备的标识。

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/电源回调,然后创建设备。 驱动程序通过调用 AcxDeviceAddCircuitDevice 来实例化新设备/线路。 有关详细信息,请参阅 ACX 设备枚举

ACX 电路动态删除

驱动程序调用 AcxDeviceRemoveCircuitDevice 从设备列表中删除音频设备。 这会触发 ACX 电路设备/电路实体上的关机顺序。 电路设备/线路以异步方式删除。 有关详细信息,请参阅 ACX 设备枚举

AcxDeviceRemoveCircuit 和 AcxDeviceDetachCircuit

有两种常见方法来管理线路终止。 AcxDeviceDetachCircuitAcxDeviceRemoveCircuit

如果调用方调用 AcxDeviceDetachCircuit ,则它不得调用 AcxDeviceRemoveCircuit。 如果调用驱动程序希望在 AcxDeviceDetachCircuit 之后删除线路,则应使用 WdfObjectDelete

通过调用 AcxDeviceRemoveCircuit ,调用驱动程序告知 ACX 删除此线路并从设备中删除/删除它。 在这种情况下,无需对电路调用 WdfObjectDelete。

总之,AcxDeviceDetachCircuit 表示驱动程序负责管理电路对象的生命周期,AcxDeviceRemoveCircuit 表示将移除并删除电路。

有关 WDF 对象生存期管理的一般信息,请参阅 Framework 对象生命周期

AcxDeviceRemoveCircuitDevice

与上述线路终止不同,音频驱动程序使用 AcxDeviceRemoveCircuitDevice 删除现有音频终结点,并且可以在驱动程序的生命周期内随时调用。

驱动程序还可以选择在重新平衡时始终销毁和重新创建音频设备。 当设备检测到新设置与旧设置不兼容时,情况与上述方案相同。

必须在 EvtDevicePrepareHardware/EvtDeviceReleaseHardware 回调中删除线路,并在 EvtDevicePrepareHardware 中重新创建新线路。 驱动程序可注销线路来删除线路(使用 AcxDeviceRemoveCircuit)。

EvtAcxCircuitReleaseHardware (EVT_ACX_CIRCUIT_RELEASE_HARDWARE) 回调函数

如果驱动程序已注册 EvtAcxCircuitReleaseHardware 回调函数 ,则框架会在以下转换期间调用它:

  • 资源重新均衡
  • 有序删除
  • 意外删除

ACX 框架在 WDF 框架停止向设备发送 I/O 请求后调用 EvtAcxCircuitReleaseHardware 回调函数,已禁用和断开连接分配给设备的任何中断,并且设备已关闭。

ACX 框架在 WDF 框架调用驱动程序的 EvtDeviceReleaseHardware 回调函数之前调用 EvtAcxCircuitReleaseHardware 回调函数。

当框架调用 EvtAcxCircuitReleaseHardware 时,设备的 PDO 仍然存在,并且可以查询设备信息,这些信息在电源关闭状态下可用,例如 PCI 配置状态。

此外,框架提供给 EvtDeviceReleaseHardware 的已转换硬件资源仍分配给设备。 此回调函数的主要用途是释放这些资源,特别是取消映射驱动程序的 EvtAcxCircuitPrepareHardware 回调函数映射的任何内存资源。 驱动程序还可以使用此回调来执行可能处于关闭状态的任何其他 ACXCIRCUIT 管理活动。 通常,所有其他硬件关闭作都应发生在驱动程序的 EvtDeviceD0Exit 回调函数中。

如果调用驱动程序的 EvtAcxCircuitPrepareHardware 回调函数,ACX 框架始终调用驱动程序的 EvtAcxCircuitReleaseHardware 回调函数,除非 EvtAcxCircuitPrepareHardware 返回了失败代码。

有关硬件资源的详细信息,请参阅 硬件资源简介

EvtAcxFactoryCircuitReleaseHardware(EVT_ACX_FACTORY_CIRCUIT_RELEASE_HARDWARE)回调函数

当框架调用 EvtAcxFactoryCircuitReleaseHardware 时,该设备的 PDO 仍然存在,并且可以查询处于关闭状态的设备信息,例如 PCI 配置状态。

此外,框架提供给 EvtDeviceReleaseHardware 的已转换硬件资源仍分配给设备。 此回调函数的主要用途是释放这些资源,特别是取消映射驱动程序的 EvtAcxCircuitPrepareHardware 回调函数映射的任何内存资源。 驱动程序还可以使用此回调来执行可能处于关闭状态的任何其他 ACXCIRCUIT 管理活动。 通常,所有其他硬件关闭作都应发生在驱动程序的 EvtDeviceD0Exit 回调函数中。

如果调用驱动程序的 EvtAcxFactoryCircuitPrepareHardware 回调函数,ACX 框架始终调用驱动程序的 EvtAcxFactoryCircuitReleaseHardware 回调函数,除非 EvtAcxFactoryCircuitPrepareHardware 返回了失败代码。

有关管理 WDF 和线路对象的详细信息,请参阅 ACX WDF 驱动程序生存期管理

另请参阅

ACX 音频类扩展概述

ACX 多堆栈跨驱动程序通信

ACX WDF 驱动程序生存期管理

ACX 对象的摘要