Skip to main content
每个音频用例都是一个包含特定类型子图的图。每个子图包含一个或多个执行特定功能的功能性软件块(称为模块)。

在 PAL 层自定义

平台抽象层(PAL)提供更高层的音频专用 API,用于访问音频硬件和驱动程序。在 PAL 层进行自定义可让您控制流行为、设备路由、缓冲区配置和平台特定的音频设置。

PipeWire PAL 插件

PipeWire PAL 插件(pw-pal-plugin)将 PipeWire 流直接桥接到 PAL API。它作为 PipeWire 模块运行,处理 PipeWire 与 AudioReach 硬件栈之间的所有音频路由。 该插件执行以下操作:
  • 打开并管理用于播放和捕获的 PAL 流
  • 配置混音器控制,以设置硬件编解码器设备和流配置
  • 调用 PAL API 打开并启动音频会话
  • 在 PipeWire 缓冲区和 PAL DMA 缓冲区之间路由音频数据
以下是 PipeWire PAL 插件的组件:
Source产生数据流(音频/视频帧)并公开输出端口的节点。PipeWire source 节点:
  • 无需接收数据
  • 通过输出端口向外推送数据
  • 基于时钟/驱动/捕获触发器运行
  • 通常与硬件或软件生成器绑定
Sink消费传入数据并公开输入端口的节点。PipeWire sink 节点:
  • 通过输入端口接收数据
  • 不生成自身的主要数据
  • 通常与硬件播放/输出交互
  • 控制缓冲和渲染
PAL 资源管理器跟踪所有活动会话和设备,以支持并发。它从以下平台 XML 文件中解析并加载配置:
  • Resource_manager.xml — 设备到后端的映射以及策略制定属性
  • Card-defs.xml — 虚拟 PCM 和 compress 节点及其选项
  • mixer_paths.xml — 定义所有底层音频路由路径和控制,决定声音如何在设备上被录制、处理和播放
  • plugin_manager.xml — 将音频流、会话和设备与其对应的插件库和函数关联,用于运行时音频处理
  • usecaseKvManager.xml — 将音频流和设备映射到 DSP 处理图,决定音频在芯片内部的处理方式
PipeWire PAL 插件源代码位于:
PAL 源代码位于:
以下文件列出了 PAL 模块公开的所有 API:

PAL API

以下是常用的 PAL API。有关所有 API 的完整说明,请参阅 PalApi.h

pal_init

初始化 PAL,解析相关配置文件,并将其存储在本地结构中以供使用。
参数 返回值
  • 成功时返回 0
  • 失败时返回错误代码

pal_deinit

反初始化 PAL,并释放初始化期间分配的资源。
参数 返回值

pal_stream_open

使用指定的配置(例如源/接收设备和媒体配置)打开一个流。成功时返回流句柄。
参数 返回值
  • 成功时返回 0
  • 失败时返回错误代码

pal_stream_start

启动一个流。
参数 返回值
  • 成功时返回 0
  • 失败时返回错误代码

pal_stream_read

读取从音频源设备捕获的音频缓冲区。
参数 返回值
  • 成功时返回读取的字节数
  • 失败时返回错误代码

pal_stream_write

写入音频缓冲区,以便通过接收设备渲染流。
参数 返回值
  • 成功时返回写入的字节数
  • 失败时返回错误代码

pal_stream_stop

停止一个流。
参数 返回值
  • 成功时返回 0
  • 失败时返回错误代码

pal_stream_close

关闭一个流。
参数 返回值
  • 成功时返回 0
  • 失败时返回错误代码

配置文件

通过使用 mixer_pathsresourcemanagerusecasekvmanager XML 文件,在 PAL 层配置音频用例。 下表列出了每个受支持平台的配置文件: QCS6490 配置文件 Qualcomm Dragonwing IQ-9075 配置文件 Qualcomm Dragonwing IQ-8275 配置文件 Talos QCS615 配置文件

自定义 mixer paths XML 文件

混音器控制是从 ALSA 混音器公开给用户空间的控制变量。它允许用户空间访问 set 和 get 函数,并将参数传递给 ALSA 混音器。 平台使用 mixer_paths_<sound-card-name>.xml 文件作为混音器路径。该文件位于目标设备的 /etc/ 文件夹中。 以下是在 mixer_paths.xml 文件中启用单声道扬声器设备的示例条目。当触发播放且所选设备为扬声器时,以下混音器控制会在音频路由辅助类的帮助下运行:

自定义 resource manager XML 文件

Resourcemanager.xml 文件包含所有可能的设备、用例和组合。它还包含其他配置、模块参数和全局参数。 以下是 resource manager XML 文件中扬声器设备条目的示例。它包含扬声器设备的所有配置,例如后端名称、声道、采样率和位宽:

自定义 usecasekvmanager XML 文件

Usecasekvmanager.xml 文件包含每个用例的 GKV 详细信息。PAL 使用此 XML 文件获取每个用例的 KV 配置,然后使用该配置从 acdb 文件中获取图信息。该文件位于设备的 /etc 文件夹中。 以下是一个流和设备图键向量配置的示例: Stream KV
Device KV
DevicePP KV

同步和编译音频组件

音频软件使用位于启用了 Linux 的音频软件目录中的用户空间和内核空间模块。音频用户空间和内核模块源代码树会提取到以下路径:
使用 devtool Linux 实用工具获取、提取和构建音频模块源代码。
进入工作区(<workspace>/build-qcom-wayland$),以使用 devtool 访问源代码树。

同步 PipeWire

  1. 提取源代码树:
    PipeWire 源代码树提取到:
  2. 构建源代码树:

同步 PAL

  1. 提取源代码树:
    PAL 源代码树提取到:
  2. 构建源代码树:

同步 TinyALSA

  1. 提取源代码树:
    TinyALSA 源代码树提取到:
  2. 构建源代码树:

音频模块源代码位置

如果您对随 Qualcomm Linux 发布的专有软件拥有完全访问权限,可以在以下位置查看音频模块源代码:

音频图术语

音频图术语

图段

一个音频用例包含以下段。 前端表示 stream 和 streamPP 子图,而后端表示每流每设备(PSPD)、devicePP 和 device 子图。 图段 前端通过路由混音器控制连接到后端后,完整的 GKV 通过串联子图 GKV 以及使用混音器控制分配的 CKV 形成。打开前端 PCM 或 compress 设备时,AGM 使用串联后的 GKV 和 CKV 调用 GSL API,以在 SPF 中设置图并应用校准。同时,AGM 会打开与所连接后端对应的内核 PCM 设备,以开始音频外设设置。

示例音频图

下图展示了播放场景的示例音频图。
用于播放的示例音频图

用于播放的示例音频图

CONT#1PCM ConverterPCM DecoderWrite SHMEM EPCONT#6Media Format ConverterCONT#2SplitterPP2PP1CONT#8HW EPCONT#7PP6PP5MixerClient PCM DataSGKV: [StreamRx: PCM Low Latency PlaybackInstance: instance 1]SGKV: [StreamRx: PCM Low Latency Playback Device: SpeakerInstance: instance 1]SGKV: [DeviceRx:SpeakerDevicePP rx: Speaker PP]SGKV: [DeviceRx:Speaker] 用于播放的示例音频图 在此图中:
  1. stream 子图包含写入共享内存端点、PCM 解码器和 PCM 转换器。客户端将 PCM 样本传递给写入共享内存端点。
  2. 如有必要,PCM 转换器会将 PCM 样本转换为流专用后处理模块支持的格式。
  3. stream 子图的输出被送入 stream-device 子图,该子图包含媒体格式转换器(MFC)。MFC 将 stream 子图的 PCM 转换为 device 子图的 PCM 格式。
  4. 转换后,stream-device 子图的输出被送入 device PP 子图,以进行设备专用后处理。子图起始处放置了一个混音器,用于混合输入流。
  5. devicePP 子图的输出随后被送入 device 子图,该子图包含诸如 I2S 驱动程序之类的硬件端点模块。
以下是此示例图的 GKV:

音频图管理器

音频图管理器(AGM)提供接口,允许基于 TinyALSA 的混音器控制以及 PCM/compress 插件进行交互并启用音频用例。AGM 作为在用户空间运行的 PipeWire 服务的一部分运行。 AGM 为混音器插件以及 PCM/compress API 提供 API,用于设置音频用例。它维护多个 ALSA 客户端来设置用例。AGM 还管理前端到后端的连接。 下图展示了 AGM 模块的高层视图。
高层 AGM 软件模块

高层 AGM 软件模块

Kernel spaceUserspaceAGM serviceAGM APIPALSession objectsGSLALSA devicesGraph objectsDevice objects 高层 AGM 软件模块 AGM 对象

AudioReach 图服务

AudioReach™ 信号处理框架图服务(ARGS)由图服务层(GSL)、通用数据包路由器(GPR)和 acdb 管理层(AML)组成。它负责图的初始化和创建,以及创建用于向 SPF 发送一系列命令的数据包。 ARGS 组件

音频校准数据库

acdb 是应用处理器上的静态数据库。它包含 LPAI 的所有调优/校准参数。*.acdb 文件格式组织了各种用例下各种音频模块的校准数据。 使用 QACT(一款 PC 工具)编辑此文件格式,并将其放置在设备文件系统的 /etc/acdbdata/ 文件夹中。在用例初始化或设备切换期间,AML 使用指定的 GKV 查询 acdb 数据库,并将设备校准数据推送到 SPF。

AudioReach 引擎(ARE)

AudioReach 引擎(ARE)运行在 LPAI 子系统中,执行音频数据处理。 下图给出了 SPF 中所用功能块的高层概览。
高层 SPF 软件模块

高层 SPF 软件模块

Processing Domain BProcessing Domain ASignal Processing Framework (SPF)Generic Packet Router (GPR)Audio Processing Manager (APM)OffloadSpecializedGenericContainerM1M2M3AMDPRMIRMModule-2Module-3…ApplicationPlatform and OS abstraction layerBoard Support Package(timer, memory manager, power manager, debug, etc.)Hardware driversReal-Time Operating System (RTOS)CAPIModule-1CAPICAPI 高层 SPF 软件模块 SPF 组件

后续步骤