本主题讨论 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 根据请求 (#9) 创建 ACXCIRCUIT。
当检测到所有的 ACXCIRCUIT 并处于活动状态时,ACXCOMPOSITE 也会随之激活,并指示 ACXCIRCUITMANAGERS 为这些线路启用“音频”接口。
以下序列图显示了两条 ACX 线路(线路 A 和 B)如何绑定在一起以创建完整的音频路径,该路径由音频终结点生成器(AEB)与软件音频设备表示。
多电路格式协商
本部分介绍当音频终结点由两条或更多条线路组成时进行的格式协商。 有关 ACX 线路的一般信息,请参阅 ACX 多堆栈跨驱动程序通信。
下层桥引脚
下层桥引脚是将数据发送到(呈现)或从物理音频设备直接或间接接收数据的引脚。 这种类型的引脚可能或可能没有与之关联的 ACXMODEFORMATLIST。 这些网桥引脚具有“AcxPinQualifierBridgeB”或“AcxPinQualifierBridgeDevice”类型。 有关 ACXMODEFORMATLIST 的详细信息,请参阅 acxdataformat.h 标头。
在此图表和文章中,上行和下行用于描述流动方向,因为上游或下游流动的方向取决于引脚是发送数据(渲染)还是接收数据(捕获)。
缺少 ACXMODEFORMATLIST 的下层桥接引脚
驱动程序可以选择不在其下层引脚上公开模式格式列表。 如果模式-格式列表在下层桥接引脚上不可用,则用户(通过声音控制面板)或其他软件实体不能直接控制或指定该引脚的音频格式及相关流。 这些是不需要这些列表的一些方案:
只能流式传输的线路,这些线路可以连接到 DSP 线路、CODEC 线路或直接连接到音频设备。 这些线路只需将数据从 A 点移动到点 B,而无需对其进行修改。 这些线路不会更改传入/传出流的数据采样率。 在这种情况下,模式格式列表与上层引脚相关联。
没有修改传入/传出采样率的元素的单个流线路。 例如 USB 音频设备线路。 在此方案中,模式格式列表与上层引脚相关联。
缺少数据格式列表意味着源自此引脚的流的数据格式与附加线路上层引脚的数据格式之一兼容。
带 ACXMODEFORMATLIST 的下层桥引脚(s)
驱动程序可以选择在其下层引脚上公开模式格式列表。 如果模式格式列表在下层桥钉上可用,则用户(通过声音控制面板)或其他软件实体可以直接控制/指定此引脚的音频格式和关联的流。
下面是使用这些模式格式列表的一些有效方案:
- DSP 线路 - 通常,这种类型的线路支持以不同采样率运行的多个流,这些流在内部转换为通用采样率,并在数据移动到下一条线路之前混合。 数据格式列表控制/确定此电路的最终采样率。
当存在数据格式列表时,这些数据格式需要匹配下一线路引脚上层引脚中的数据格式样本。 请注意,模式不需要匹配,请参阅以下部分中的模式讨论。
下行格式列表提供了用户或上层系统控制生成流格式的机会,在这种情况下,列表的默认值是当前使用的采样率,直到在此引脚上显式采取操作更改格式为止。
有关格式列表的详细信息,请参阅 acxdataformat.h 标头。
上层桥引脚
上层桥接引脚是用于直接或间接从(呈现)或向(捕获)软件模块发送或接收数据的引脚。 这种类型的引脚应具有与之关联的 ACXMODEFORMATLIST 列表。 这些桥钉具有“AcxPinQualifierBridgeA”类型。
此处所示的上图还可用于显示流式处理引脚、两条线路和设备之间的呈现和捕获数据流。
提升 [Bridge] 引脚,无需 ACXMODEFORMATLIST(s)
没有模式格式列表的上层引脚不是有效的组合,这会导致配置错误的终结点。 从用户的角度来看,终结点不可见。
升级 [Bridge] 引脚与 ACXMODEFORMQATLIST(s)
上级引脚必须始终具有一个或多个 ACXMODEFORMATLIST。 mode-format-lists 列出每个模式的所有可能采样率及其默认采样率。 不同的模式可能有不同的采样率集。 默认采样率是该模式的首选采样率。
模式和线路
单流线路或多流线路的上层引脚可以支持一个或多个模式格式列表。 单流电路一次只能有一种模式处于活动状态,而多流电路能够使用不同的模式同时运行两个或多个流。
模式映射
本部分简要介绍了标准模式,并解释了为何使用“mode”映射。
RAW 模式: 流/电路不会对流应用任何效果(可能的例外是音量控制、静音功能和安全约束,如扬声器保护)。
默认模式: 流/线路执行一些默认效果。
<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 到 > 默认值/f2
m2/f3 到 > default/f3
无效条目: m2/f4 到 > None
模式映射由驱动程序在 ACX 的帮助下完成。 在上表中,最后一项无效,上级电路的下级引脚应取消 m2/f4 作为其支持格式的选项。 请注意,这可能发生在反向,即下层线路的上层引脚可能也支持 f4 和 f5。 在这种情况下,支持 default-f4,但不支持 default-f5。 在这种情况下,下层线路的上层引脚负责不将其列为列表中的 m?/f5 选项。 以下进一步部分介绍了此过程。
格式协商
在 ACX 启用构成复合设备的线路的音频接口之前,它确保线路可以协商音频数据的模式/格式。 ACX 通过在复合的所有线路上调用复合初始化回调来执行此线路通知。 序列从下层(设备端)到上层(系统端)。 在这一阶段,电路可以更新其格式。
设备格式控制面板的显示屏
当前声音控制面板逻辑显示设备格式列表,如下所示:
- 如果音频设备支持音频引擎元素,控制面板中显示的数据格式列表是设备数据格式列表,即附加到下层引脚的数据格式列表(连接到音频引擎元素输出引脚)。
- 如果音频设备不支持音频引擎组件,控制面板中显示的数据格式列表是流媒体引脚数据格式列表,即附于上层引脚的数据格式列表。
多路自动降级流创建
ACX 使用与下层桥引脚关联的 ACXSTREAMBRIDGE 对象自动将 create-stream(s) 请求传播到远程线路。
当客户端应用创建流时,该请求首先由流式传输引脚接收。 ACX 通过在线路创建时指定的回调通知驱动程序关于创建流请求的流式处理引脚。 在回调中,驱动程序创建一个 ACXSTREAM 对象,该对象表示流,然后将控件返回 ACX。 当 ACX 收到控制权时,它会检查它是否需要将此创建请求转发到下一个(下层)线路。 (可选)驱动程序可以在从其 create-stream 回调返回之前将创建请求转发到下一个(下层)线路。 后一个选项允许驱动程序在低版本电路有机会处理创建请求之后执行任何后续操作。
ACX 使用以下默认逻辑创建流:
- 如果没有下层桥钉,则全部完成。
- 如果驱动程序已手动将流与 ACXSTREAMBRIDGE 相关联,则全部完成。
- 如果下层桥接引脚没有为指定的模式提供 ACXSTREAMBRIDGE,则请求会失败。
- ACX 通过检索的 ACXSTREAMBRIDGE 添加驱动程序创建的新流。
ACXSTREAMBRIDGE 作为一个多输入单输出的设备。只要存在输入流,ACXSTREAMBRIDGE 就保持输出流。 仅当删除最后一个流入时,才会删除流出。 ACXSTREAMBRIDGE 在决定要用于远程线路的模式和格式时,使用与下层桥引脚关联的 ACXDATAFORMATLIST。
ACXSTREAMBRIDGE 使用以下逻辑来选择流模式和数据格式:
如果未指定 Out-stream 的 MODE,请检查是否存在“默认”格式列表。
如果未指定 Out-stream 的 MODE 且“default”格式列表不存在,请检查是否存在“raw”格式列表。
当 MODE 为 NULL_GUID 时,检查是否存在与首个流中的 MODE 相关联的格式列表。
如果指定了 MODE,请检查此 MODE 是否有格式列表。
如果找到格式列表,请从格式列表中获取默认格式。
如果未找到格式,ACXSTREAMBRIDGE 将使用第一个数据流的格式。
ACXSTREAMBRIDGE 使用检索的 MODE 和数据格式使用 ACXTARGETSTREAM 生成流创建请求,如下所示:
- 如果指定了 MODE,则使用该 MODE。
- 如果 MODE 是 NULL_GUID,则使用第一个流中的 MODE。
- 否则不使用模式。
当最后一个输入流被移除时,ACX 会小心地删除或关闭目标流。
ACXSTREAMCIRCUIT 的另一个作业是自动沿流链传播流状态。
驱动程序有机会通过调用 AcxCircuitInitDisableDefaultStreamBridgeHandling 或手动将 ACXSTREAM 对象与 ACXSTREAMBRIDGE 关联来关闭默认线路的远程流桥创建,然后再将控制权返回到 ACX。 在后一种情况下,远程流会在驱动程序返回“create-stream” EVT_ACX_CIRCUIT_CREATE_STREAM 回调函数之前被创建。
对于使用多个捕获/渲染引脚,例如主机/卸载/环回/kws,支持音频引擎元素时,驱动程序必须创建流桥而不指定任何输入模式,并在处理创建流的回调时手动将传入的ACXSTREAM对象添加到流桥中。
有关流桥创建的详细信息,请参阅:
多电路自动流状态传播到低级流
ACXSTREAMBRIDGE 会自动将流状态请求向下传播到远程线路。 当流的状态发生更改时,ACXSTREAMBRIDGE 将计算流外流的混合状态,并使用 ACXTARGETSTREAM 将该新的“stream-state”请求发送到远程流。
ACXSTREAM 和 ACXSTREAMBRIDGE 使用以下逻辑:
在这些场景中,首先更改上游流的状态:
- 渲染&&从停止到
运行 - 捕获和从运行到>停止
- 其他:从运行状态转为停止状态
- 渲染&&从停止到
在以下情况中最后更改上层流的状态:
- 呈现和从运行>停止
- 捕获&&从停止到
运行 - 其他 && 从停止到运行
驱动程序可以选择通过配置设置来反转此顺序。
注释
驱动程序/电路/流必须确保流从运行状态始终成功过渡到停止状态。 另一方面,允许驱动器在倒车时失败,即从静止到运行。