ACX 多线路组合
本主题讨论 ACX 多线路组合。 有关 ACX 的一般概述和 ACX 术语列表,请参阅 ACX 音频类扩展概述。
如 ACX 对象摘要中所述,AcxCircuit 表示用户感知音频设备(扬声器、麦克风等)的部分或完整音频路径。 AcxCircuit 至少有一个输入引脚和一个输出引脚 (ACXPIN),并且可以聚合一个或多个类似 AcxElements 的对象。 有关常规信息,请参阅 ACX 线路。
ACX 线路组合
ACX 将线路绑定在一起,直到它们形成完整音频路径。 ACX 使用音频绑定将音频线路连接在一起。 同时,会将每个 ACX 线路都转换为 KS 筛选器,然后由作为用户模式服务运行的音频终结点生成器 (AEB) 检测这些 KS 筛选器。 AEB 会扫描检测到的 KS 筛选器图,并在检测到完整音频路径时创建表示下划线音频基础结构的软件音频终结点。
下图显示了 ACX 用于检测、生成和监视构成复合音频终结点的线路的 ACX 对象。
重要
请注意,仅以蓝色显示的类型是公共类型:ACXCIRCUITTEMPLATE、ACXCOMPOSITETEMPLATE(未显示)、ACXMANAGER、ACXCIRCUITFACTORY 和 ACXCIRCUIT。 以紫罗兰色显示的所有类型都是内部类型,此处仅出于说明目的将其列出。 不保证内部类型保持不变,也不保证在 ACX 的不同版本中可用,并且不得直接调用或使用。
在 ACX 驱动程序向 ACX 管理器注册这些模板时,ACX 管理器会在驱动程序初始化时解析线路模板。 ACX 驱动程序使用 ACXCIRCUTTEMPLATES (#1) 注册复合模板/绑定。
当 ACX 管理器收到线路模板时,会检查这是实例模板还是通用类模板。
对于实例模板,ACX 会为通用类模板创建 ACXCOMPOSITEMANAGER (#4),ACX 会创建 ACXCOMPOSITEFACTORY (#2),后者负责在检测到复合的“核心”线路时创建 ACXCOMPOSITEMANAGER 项 (#3)。 核心线路是向复合音频终结点提供标识的线路。
ACXCOMPOSITEMANAGER 反过来会创建 ACXCOMPOSITE (#5),以表示下划线复合音频终结点。 复合管理器负责监视在创建/初始化复合后可能出现的任何可选线路段。
ACXCOMPOSITE 又为属于复合的每个线路创建 ACXCIRCUITMANAGER (#6)。 ACXCIRCUITMANAGER 负责创建、监视和控制单个线路 (#7)。
可能会将线路标记为“按需”,在这种情况下,ACXCIRCUITMANAGER 会查找其线路工厂并请求复合 (#8) 的新线路。 ACXCIRCUITFACTORY 会将 ACXCIRCUIT 创建为请求 (#9)。
当检测到所有 ACXCIRCUIT 并且都处于活动状态时,ACXCOMPOSITE 也会处于活动状态,并指示 ACXCIRCUITMANAGERS 为其线路打开“音频”接口。
以下序列图显示了两条 ACX 线路(线路 A 和 B)如何绑定在一起,以创建完整音频路径,该路径由音频终结点生成器 (AEB) 使用软件音频设备表示。
多线路格式协商
本部分介绍当音频终结点由两个或更多线路组成时进行的格式协商。 有关 ACX 线路的一般信息,请参阅 ACX 多栈跨驱动程序通信。
下层桥接引脚
下层桥接引脚是将直接或间接数据发送到物理音频设备(呈现)或从物理音频设备接收数据(捕获)的引脚。 这种类型的引脚可能或可能没有与之关联的 ACXMODEFORMATLIST。 这些桥接引脚具有“AcxPinQualifierBridgeB”或“AcxPinQualifierBridgeDevice”类型。 有关 ACXMODEFORMATLIST 的详细信息,请参阅 acxdataformat.h 标头。
在此关系图中,上层和下层用于描述流方向,因为向上或向下流流的方向取决于引脚是在发送数据(呈现)还是接收数据(捕获)。
无 ACXMODEFORMATLIST 的下层桥接引脚
驱动程序可以选择不在其下层引脚上公开模式格式列表。 如果模式格式列表在下层桥接引脚上不可用,则用户(通过声音控制面板)或其他软件实体无法直接控制/指定此引脚和关联流的音频格式。 这些是一些不需要这些列表的方案:
仅流式传输线路,这些线路可以连接到 DSP 线路、CODEC 线路或直接连接到音频设备。 这些线路只需将数据从 A 点移动到点 B,而无需修改数据。 这些线路不会更改传入/传出流的数据采样率。 在这种情况下,模式格式列表与上层引脚关联。
没有修改传入/传出采样率的元素的单流线路。 例如 USB 音频设备线路。 在此方案中,模式格式列表与上层引脚关联。
缺少数据格式列表意味着源自此引脚的流的数据格式与附加线路上层引脚的数据格式之一兼容。
含 ACXMODEFORMATLIST 的下层桥接引脚
驱动程序可以选择在其下层引脚上公开模式格式列表。 如果模式格式列表在下层桥接引脚上可用,则用户(通过声音控制面板)或其他软件实体可以直接控制/指定此引脚和关联流的音频格式。
下面是一些使用这些模式格式列表的有效方案:
- DSP 线路 - 通常,这种类型的线路支持以不同采样率运行的多个流,这些流将在内部转换为通用采样率,并在数据移到下一条线路之前进行混合。 数据格式列表控制/指定最终采样率(对于此线路)。
当存在数据格式列表时,这些数据格式需要与下一个线路引脚的上层引脚中的数据格式样本匹配。 请注意,模式不需要匹配,请参阅以下几个部分中的模式讨论。
下层格式列表让用户/上层有机会控制所生成流的格式,在这种情况下,列表的默认值是使用的采样率,直到执行显式操作来更改此引脚上的格式为止。
有关格式列表的详细信息,请参阅 acxdataformat.h 标头。
上层桥接引脚
上层桥接引脚是直接或间接从软件模块接收数据(呈现)或将数据发送到软件模块(捕获)的引脚。 这种类型的引脚应具有与之关联的 ACXMODEFORMATLIST。 这些桥接引脚具有“AcxPinQualifierBridgeA”类型。
此处所示的上图还可用于显示流式处理引脚、两条线路和设备之间的呈现和捕获数据流。
无 ACXMODEFORMATLIST 的上层 [桥接] 引脚
没有模式格式列表的上层引脚不是有效的组合,并且这会导致产生配置错误的终结点。 从用户的角度来看,终结点不可见。
含 ACXMODEFORMQATLIST 的上层 [桥接] 引脚
上层引脚必须始终具有一个或多个 ACXMODEFORMATLIST。 模式格式列表为模式及其默认采样率指定所有可能的采样率。 不同的模式可能有不同的采样率集。 默认采样率是该模式的首选采样率。
模式和线路
单流线路或多流线路的上层引脚可以支持一个或多个模式格式列表。 单流线路一次具有一个处于活动状态的模式,而多流线路可以使用不同的模式同时运行两个或多个流。
模式映射
本部分简要介绍了标准模式,并解释了为何使用“模式”映射。
RAW 模式:流/线路不会对流应用任何效果(可能音量、静音和安全约束(如扬声器保护)除外)。
DEFAULT 模式:流/线路会执行一些默认效果。
<mode_name> mode
:流/线路应用特定于所选 <mode_name> 模式的效果。
流式处理引脚必须支持原始和/或默认模式。 流式处理引脚可根据需要支持任何其他 <mode_name> modes
。
在复合终结点中,上层线路可能支持多个模式,下层线路可能仅支持 RAW 和/或 DEFAULT。
双线路终结点中的示例:
上层线路的下层引脚支持模式和关联的格式 m1{f1,f2} 和 m2{f3,f4},即这意味着使用 m1 时,引脚流的格式为 f1 或 f2,或者使用 m2 时为 f3 或 f4 的格式。 这假定上层线路是单流线路。
下层线路的上层引脚支持默认模式 {f1,f2,f3}。
在这种情况下,会将流模式从 <mode_name> 模式转换为默认模式,同时保持相同的采样率。
m1/f1 到 > default/f1
m1/f2 到 > default/f2
m2/f3 到 > default/f3
无效条目:m2/f4 到 > None
模式映射由驱动程序借助 ACX 完成。 在上表中,最后一个条目无效,作为其支持格式的选项,上层线路的下层引脚应删除 m2/f4。 请注意,这可能会发生在反向,即下层线路的上层引脚可能也支持 f4 和 f5。 在这种情况下,支持 default-f4,但不支持 default-f5。 在这种情况下,下层线路的上层引脚负责不将 m?/f5 列为其列表中的选项。 以下几个部分介绍了此过程。
格式协商
在 ACX 启用构成复合设备的线路的音频接口之前,可确保线路可以协商音频数据的模式/格式。 ACX 通过在复合的所有线路上调用复合初始化回调来执行此线路通知。 序列从下层(设备端)到上层(系统端)。 线路有机会在此阶段更新其格式。
设备格式控制面板显示
当前声音控制面板逻辑显示设备格式列表,如下所示:
- 如果音频设备支持音频引擎元素,控制面板中显示的数据格式列表是设备数据格式列表,即附加到下层引脚的数据格式列表(连接到音频引擎元素输出引脚的下层引脚)。
- 如果音频设备不支持音频引擎元素,控制面板中显示的数据格式列表是流式处理引脚数据格式列表,即附加到上层引脚的数据格式列表。
多线路自动下层流创建
ACX 使用与下层桥接引脚关联的 ACXSTREAMBRIDGE 对象,自动将创建流请求传播到远程线路。
当客户端应用创建流时,流式传输引脚会先收到该请求。 ACX 通过线路创建时指定的所提供回调通知驱动程序有关创建流请求的流式处理引脚。 在回调中,驱动程序会创建一个 ACXSTREAM 对象,该对象表示流,然后将控制权返回给 ACX。 当 ACX 收回控件权时,将检查是否需要将此创建请求转发到下一个(下层)线路。 (可选)驱动程序可以在从其创建请求回调返回之前将创建请求转发到下一个(下层)线路。 后一个选项允许驱动程序在下层线路有机会处理其创建请求后执行任何后处理操作。
ACX 使用以下默认逻辑创建流:
- 如果没有下层桥接引脚,则表示全部完成。
- 如果驱动程序已手动将流与 ACXSTREAMBRIDGE 相关联,则表示全部完成。
- 如果下层桥接引脚没有指定 MODE 的 ACXSTREAMBRIDGE,则请求失败。
- ACX 将添加驱动程序使用检索到的 ACXSTREAMBRIDGE 创建的新流。
ACXSTREAMBRIDGE 充当多输入/单输出。只要存在输入流,ACXSTREAMBRIDGE 就会保留输出流。 仅当删除最后一个输入流时,才会删除输出流。 在决定要用于远程线路的模式和格式时,ACXSTREAMBRIDGE 会使用与下层桥接引脚关联的 ACXDATAFORMATLIST。
ACXSTREAMBRIDGE 使用以下逻辑来选择流模式和数据格式:
如果未指定输出流的 MODE,请检查是否存在“默认”格式列表。
如果未指定输出流的 MODE,且不存在“默认”格式列表,则检查是否存在“原始”格式列表。
如果 MODE 是 NULL_GUID,则检查是否存在与第一个输入流的 MODE 关联的格式列表。
如果指定了 MODE,则检查是否存在此 MODE 的格式列表。
如果找到格式列表,请从格式列表中获取默认格式。
如果未找到格式,ACXSTREAMBRIDGE 将使用第一个输入流的格式。
ACXSTREAMBRIDGE 会使用检索到的 MODE 和数据格式通过 ACXTARGETSTREAM 生成流创建请求,具体如下:
- 如果指定了 MODE,则使用该 MODE。
- 如果 MODE 是 NULL_GUID,则使用第一个输入流的 MODE。
- 否则不使用模式。
删除最后一个输入流时,ACX 会小心删除/关闭目标流。
ACXSTREAMCIRCUIT 的另一个作业是自动沿流式处理链传播流状态。
驱动程序有机会调用 AcxCircuitInitDisableDefaultStreamBridgeHandling 或手动将 ACXSTREAM 对象与 ACXSTREAMBRIDGE 关联,来关闭默认线路的远程流桥接桥创建,然后再将控制权返回给 ACX。 在后一种情况下,会在驱动程序从“创建流”返回 EVT_ACX_CIRCUIT_CREATE_STREAM 回调函数之前创建远程流。
对于使用多个捕获/呈现引脚(例如主机/卸载/环回/kws)的线路,例如,当支持音频引擎元素时,驱动程序必须创建流桥接,而不指定任何模式,并在处理创建流回调时手动将传入 ACXSTREAM 对象添加到流桥接。
有关创建流桥接的详细信息,请参阅:
多线路自动流状态传播到下层流
ACXSTREAMBRIDGE 会自动将流状态请求向下传播到远程线路。 当流的状态发生更改时,ACXSTREAMBRIDGE 将计算输出流的混合状态,并使用 ACXTARGETSTREAM 将该新的“流状态”请求发送到远程流。
ACXSTREAM 以及 ACXSTREAMBRIDGE 将使用以下逻辑:
在这些方案中,首先更改上层流的状态:
- 呈现 && 从 Stop->Run
- 捕获 && 从 Run->Stop
- 其他 && 从 Run->Stop
在这些方案中,最后更改上层流的状态:
- 呈现 && 从 Run->Stop
- 捕获 && 从 Stop->Run
- 其他 && 从 Stop->Run
驱动程序可选择通过配置设置来反转此顺序。
注意
驱动程序/线路/流始终成功将流从运行转换为停止是一项要求。 另一方面,允许驱动程序使反向失败,即从停止到运行。