音频信号处理

概览

信号处理接口可供音频复合驱动程序使用。 此接口 SignalProcessingComposite 协议使用的 FIDL 协议,用于提供 音频信号处理功能。

SignalProcessing 协议旨在控制信号处理硬件及其 和拓扑。我们将处理元素 (PE) 定义为所提供的音频数据处理逻辑单元 我们通过音频驱动程序将拓扑定义为 PE 在流水线中的排列方式, 与之相关联的控件

借助 SignalProcessing 协议,硬件供应商能够实现具有稳定 应用二进制接口 (ABI),并允许系统集成商配置驱动程序以执行 根据系统或产品要求以不同方式使用这些接口 配置。

SignalProcessing 协议构成了 Reader 信号处理协议。信号处理 只检索信息的方法属于 Reader 协议的一部分,其他方法是 SignalProcessing 协议本身。这种分离使得该接口的客户端能够编写 Reader 信号处理协议转换为自己的协议(如果它们需要提供只读访问) 将一部分功能提供给他们自己的客户端。

SignalProcessing 协议及相关定义是 fuchsia.hardware.audio.signalprocessing FIDL 库。

拓扑

每个驱动程序都可以拥有自己的拓扑。驱动程序可以从应用中将拓扑 由其他驱动程序根据特定配置或产品的需要公开。请注意, 但不必向应用(尤其是 audio_core)公开拓扑。

注意:

  • 拓扑并非旨在完整描述音频流水线状态/格式/配置 为每位产品专家提供保护。目的是说明客户可以更改/重新排列哪些内容 根据其知识、配置(例如来自元数据)和特定业务逻辑进行预测。
  • 提供 Composite 协议的音频驱动程序所用的拓扑必须包含 ENDPOINT 为驱动程序支持的环形缓冲区和 DAI 互连提供 ID 的 PE。

处理元素

PE(在 fuchsia.hardware.audio.signalprocessing FIDL 库中定义为 Element)是指 预期是由特定驱动程序管理的由硬件提供的功能(但也可能是 就像在软件中模拟的任何其他驱动程序功能一样)。流水线由一个或多个 PE 组成 而一个拓扑由一个或多个流水线组成

我们将服务器称为提供信号处理协议的驱动程序。 我们将客户端称为该功能的用户,例如例如 audio_core

基本操作

客户端负责请求并配置任何信号处理功能。 服务器通过回复客户端的 GetElements 提供其 PE 后,客户端可以 发出 WatchElement 调用(请参阅挂起 get 模式)以检索 PE 状态和 SetElementState,用于根据需要动态控制 PE 参数。对于 实例,如需检索 type GAIN 的 PE 的 gain,客户端会发出 WatchElement 调用,其中一个用于检索初始状态(驱动程序将回复 客户端发送的前 WatchElement),然后发送以接收更新通知的后续请求 添加到包含 gainElementState。同样,如需检索 PE 的状态, 由 typeEQUALIZER 组成,后者由其 bands_state 中的多个频段组成,客户端会 发出一个用于检索初始状态的 WatchElement(驱动程序将回复 客户端发送的第一个WatchElement数据)包括实例 frequency 字段, 每个频段

此外,在服务器通过回复客户端的 GetElements 提供其 PE 后,客户端 可以使用 GetTopologies 方法请求可用的拓扑。如果有多个拓扑 由 GetTopologies 返回,则 SetTopology 可用于选择要使用的拓扑。

GetElements

GetElements 允许有选择性地获取所有 PE 的列表。例如,该方法可以 由客户端在抽象硬件编解码器的驱动程序上调用该方法。获知产品专家名单后 客户端,则客户端可以根据 PE 类型公开的参数配置 PE。

SetElementState

SetElementState 允许客户端使用由 GetElements。不同类型的产品专家可能向客户端公开不同的状态, “SetElementState”参数 state 的类型因 PE 类型而异。

WatchElement

WatchElement 允许客户端使用由 GetElements。不同类型的产品专家可能向客户端公开不同的状态, “WatchElement”参数 state 的类型因 PE 类型而异。

PE 的 state 由多个值组成,而这些值可以直接由客户端通过调用 SetElement 或间接调用 SetElement对 或与客户端无关,例如由于插头检测发生变化。

GetTopologies

GetTopologies 允许有选择性地获取拓扑列表。例如,该方法可能是 由客户端在抽象硬件编解码器上调用的方法。获知拓扑列表后 客户端,那么客户端可以将服务器配置为使用特定拓扑。

SetTopology

SetTopology 允许客户端控制服务器使用的拓扑。仅一个 可以随时选择拓扑。

处理元素类型

GetElements 返回的 PE 支持多种不同类型的信号处理 由 PE 类型和参数定义。PE 类型定义标准的信号处理方式(例如 GAINDELAYEQUALIZER 等)、供应商专用信号处理(VENDOR_SPECIFIC 例如,非 SignalProcessing 协议中定义的)和用于构造 的 CONNECTION_POINTs/ENDPOINT 多流水线拓扑(允许使用流水线开始、结束、路由和混合定义,请参阅 连接点端点})。

每个 PE 可以有一个或多个输入以及一个或多个输出通道。对于路由和 PE 可能会使输出通道数与输入通道数不同。

产品专家可能会更改每个通道中的数据(即处理的信号)。例如 如果流水线中有单个类型为 AGL 的 PE,该 PE 包含类型为 ENDPOINT DAI_INTERCONNECTDaiFormat number_of_channels 设置为 2,然后 AGL(自动增益) 限制)可通过客户端调用 SetElementState 来为这 2 个渠道启用或停用 state enable 设置为 true 或 false(这假设已将 AGL Element 设置为 can_disable) 设为 true)。

如果不包含不同 PE 类型中的可选字段,则处理状态 元素不会相对于特定字段进行更改。例如,如果 SetElement 中的 EqualizerBandState 不包含可选的 frequency,则 均衡器的频段频率状态不会发生变化。

供应商特定数据

ElementState vendor_specific_data 是一个可选参数,可以为任何 处理元素这样,处理元素就可以指定要发送的不透明对象, SetElementState或作为 WatchElementState

除了任何类型的不透明数据之外,VENDOR_SPECIFIC 类型的处理元素还允许 驱动程序指定 SignalProcessing 协议中未定义的类型,例如 尚未标准,或者不打算进行标准化并且仅由 特定供应商。VENDOR_SPECIFIC 类型的处理元素未指定任何 TypeSpecificElement 参数,但它可以指定要接收/接收的不透明数据, 从驱动程序中使用 ElementState vendor_specific_data 参数,这与其他任何参数相同 处理元素类型。

拓扑

GetTopologies 返回的拓扑支持 GetElementsGetTopologies 可以通告一个或多个拓扑。

一个拓扑

如果通告一个拓扑,即 GetTopologies 会返回包含一个元素的矢量,则所有 PE 都属于这一显式单一流水线。在这种情况下,排序是显式的。例如,如果 GetElements 会返回 2 个 PE:

  1. Element:id = 1,类型 = AUTOMATIC_GAIN_LIMITER (AGL)
  2. Element:ID = 2,类型 = EQUALIZER (EQ)

GetTopologies 返回的一个 Topology 元素会列出 idprocessing_elements_edge_pairs 矢量明确通告信号处理的顺序 在此示例中:

  1. Topology:id = 1,processing_elements_edge_pairs = 包含 1 个元素的矢量 processing_element_id_from = 1 且 processing_element_id_to = 2。

这将通过一个流水线通告此拓扑:

                +-------+    +-------+
Input signal -> |  AGL  | -> +  EQ   | -> Output signal
                +-------+    +-------+

在此拓扑中,开头(其中输入信号被输入到流水线中)和结尾 流水线(其中输出信号是从流水线输出)是隐式的。它们可以 ENDPOINT 类型的 PE 明确指定(请参阅下面的端点)。

如果只通告一个拓扑,则内容仅供参考,因为客户端无法 更改一个且唯一的拓扑使用。

多个拓扑

如果通告多个拓扑,即 GetTopologies 会返回包含多个元素的矢量。 那么 PE 可以用于多种配置,即拓扑。每个拓扑都会明确列出 PE 的数量及其排序,即本例中的排序是显式的。这种安排和 PE 的顺序决定了流水线。

通过仅列出所支持的 PE 的具体排列方式和顺序,服务器可以限制 都有效

例如,如果 GetElements 返回 6 个 PE:

  1. Element:id = 1,类型 = AUTOMATIC_GAIN_LIMITER (AGL)
  2. Element:ID = 2,类型 = EQUALIZER (EQ)
  3. Element:ID = 3,类型 = SAMPLE_RATE_CONVERSION (SRC)
  4. Element:id = 4,类型 = GAIN
  5. Element:ID = 5,类型 = DYNAMIC_RANGE_COMPRESSION (DRC1)
  6. Element:id = 6,类型 = DYNAMIC_RANGE_COMPRESSION (DRC2) 参数不同于 DRC1 参数。

GetTopologies 返回的 Topology 元素会列出 idprocessing_elements_edge_pairs,在此示例中为:

  1. Topology:id = 1,processing_elements_edge_pairs = *。process_element_id_from= 3 andprocessing_element_id_to= 2. *. processing_element_id_from = 2 和 processing_element_id_to = 4。 *。process_element_id_from= 4 andprocessing_element_id_to= 5. *. processing_element_id_from = 5 和 processing_element_id_to = 1。
  2. Topology:id = 2,processing_elements_edge_pairs = *。process_element_id_from= 2 andprocessing_element_id_to= 4. *. processing_element_id_from = 4 和 processing_element_id_to = 6。

这将通告两个拓扑,每个拓扑一个流水线:

                +-------+    +-------+    +-------+    +-------+    +-------+
Input signal -> |  SRC  | -> +  EQ   | -> + GAIN  | -> +  DRC1 | -> +  AGL  | -> Output signal
                +-------+    +-------+    +-------+    +-------+    +-------+

                +-------+    +-------+    +-------+
Input signal -> |  EQ   | -> + GAIN  | -> +  DRC2 | -> Output signal
                +-------+    +-------+    +-------+

连接点

CONNECTION_POINT 类型的 PE 允许:

  1. 在一个管道中混合多个渠道。
  2. 混合来自不同流水线的多个渠道。
  3. 重复频道。
  4. 将单个流水线扩展为多个流水线(分散)。

端点

ENDPOINT 类型的 PE 是可选项(即使存在 CONNECTION_POINT),并允许 使用明确的起始输入和结束输出来完善流水线结构。但对于 驱动程序提供 Composite 协议,任何受支持的环形缓冲区或 DAI 互连都必须 列为类型为 RING_BUFFER 且由 GetElements 返回的 DAI_INTERCONNECTENDPOINTComposite 协议 API 需要使用端点 PE ID 来标识环形缓冲区和 DAI 互联配置。

如果未指定 ENDPOINT,则没有传入边缘的 PE 作为输入,没有传入边缘的 PE 作为输入 作为输出边缘。例如, 上面的多个拓扑包括两个拓扑,每个拓扑都有一个 流水线,拓扑 ID 1 中的单个流水线以 PE ID 3 开头,以 PE ID 1 结尾, 拓扑 ID 2 中的单个流水线以 PE ID 2 开头,以 PE ID 6 结尾。