在 PAL 层自定义
平台抽象层(PAL)提供更高层的音频专用 API,用于访问音频硬件和驱动程序。在 PAL 层进行自定义可让您控制流行为、设备路由、缓冲区配置和平台特定的音频设置。PipeWire PAL 插件
PipeWire PAL 插件(pw-pal-plugin)将 PipeWire 流直接桥接到 PAL API。它作为 PipeWire 模块运行,处理 PipeWire 与 AudioReach 硬件栈之间的所有音频路由。
该插件执行以下操作:
- 打开并管理用于播放和捕获的 PAL 流
- 配置混音器控制,以设置硬件编解码器设备和流配置
- 调用 PAL API 打开并启动音频会话
- 在 PipeWire 缓冲区和 PAL DMA 缓冲区之间路由音频数据
| Source | 产生数据流(音频/视频帧)并公开输出端口的节点。PipeWire source 节点:
|
| Sink | 消费传入数据并公开输入端口的节点。PipeWire sink 节点:
|
Resource_manager.xml— 设备到后端的映射以及策略制定属性Card-defs.xml— 虚拟 PCM 和 compress 节点及其选项mixer_paths.xml— 定义所有底层音频路由路径和控制,决定声音如何在设备上被录制、处理和播放plugin_manager.xml— 将音频流、会话和设备与其对应的插件库和函数关联,用于运行时音频处理usecaseKvManager.xml— 将音频流和设备映射到 DSP 处理图,决定音频在芯片内部的处理方式
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_paths、resourcemanager 和 usecasekvmanager 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
同步和编译音频组件
音频软件使用位于启用了 Linux 的音频软件目录中的用户空间和内核空间模块。音频用户空间和内核模块源代码树会提取到以下路径:devtool Linux 实用工具获取、提取和构建音频模块源代码。
进入工作区(
<workspace>/build-qcom-wayland$),以使用 devtool 访问源代码树。同步 PipeWire
-
提取源代码树:
PipeWire 源代码树提取到:
-
构建源代码树:
同步 PAL
-
提取源代码树:
PAL 源代码树提取到:
-
构建源代码树:
同步 TinyALSA
-
提取源代码树:
TinyALSA 源代码树提取到:
-
构建源代码树:
音频模块源代码位置
如果您对随 Qualcomm Linux 发布的专有软件拥有完全访问权限,可以在以下位置查看音频模块源代码:音频图术语
音频图术语图段
一个音频用例包含以下段。 前端表示 stream 和 streamPP 子图,而后端表示每流每设备(PSPD)、devicePP 和 device 子图。 图段
前端通过路由混音器控制连接到后端后,完整的 GKV 通过串联子图 GKV 以及使用混音器控制分配的 CKV 形成。打开前端 PCM 或 compress 设备时,AGM 使用串联后的 GKV 和 CKV 调用 GSL API,以在 SPF 中设置图并应用校准。同时,AGM 会打开与所连接后端对应的内核 PCM 设备,以开始音频外设设置。
示例音频图
下图展示了播放场景的示例音频图。用于播放的示例音频图
- stream 子图包含写入共享内存端点、PCM 解码器和 PCM 转换器。客户端将 PCM 样本传递给写入共享内存端点。
- 如有必要,PCM 转换器会将 PCM 样本转换为流专用后处理模块支持的格式。
- stream 子图的输出被送入 stream-device 子图,该子图包含媒体格式转换器(MFC)。MFC 将 stream 子图的 PCM 转换为 device 子图的 PCM 格式。
- 转换后,stream-device 子图的输出被送入 device PP 子图,以进行设备专用后处理。子图起始处放置了一个混音器,用于混合输入流。
- devicePP 子图的输出随后被送入 device 子图,该子图包含诸如 I2S 驱动程序之类的硬件端点模块。
音频图管理器
音频图管理器(AGM)提供接口,允许基于 TinyALSA 的混音器控制以及 PCM/compress 插件进行交互并启用音频用例。AGM 作为在用户空间运行的 PipeWire 服务的一部分运行。 AGM 为混音器插件以及 PCM/compress API 提供 API,用于设置音频用例。它维护多个 ALSA 客户端来设置用例。AGM 还管理前端到后端的连接。 下图展示了 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 软件模块

