在 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 源节点:
|
| 接收端 (Sink) | 消费传入数据并暴露输入端口的节点。PipeWire 接收端节点:
|
Resource_manager.xml— 设备到后端映射以及策略制定属性Card-defs.xml— 虚拟 PCM 和压缩节点及其选项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 配置文件
自定义混音器路径 XML 文件
混音器控件是从 ALSA 混音器暴露给用户空间的控件变量。它允许用户空间访问设置和获取函数并向 ALSA 混音器传递参数。 平台使用mixer_paths_<sound-card-name>.xml 文件作为混音器路径。此文件位于目标上的 /etc/ 文件夹中。
以下是在 mixer_paths.xml 文件中启用单声道扬声器设备的示例条目。当触发播放且所选设备为扬声器时,在音频路由辅助类的帮助下运行以下混音器控件:
自定义资源管理器 XML 文件
Resourcemanager.xml 文件包括所有可能的设备、用例和组合。它还包括其他配置、模块参数和全局参数。
以下是资源管理器 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 或压缩设备后,AGM 将使用连接的 GKV 和 CKV 调用 GSL API 以在 SPF 中设置图并应用校准。同时,AGM 打开与连接的后端对应的内核 PCM 设备以开始音频外设设置。
示例音频图
下图显示了播放场景的示例音频图。播放的示例音频图
- 流子图具有写共享内存端点、PCM 解码器和 PCM 转换器。客户端将 PCM 样本传递到写共享内存端点。
- 如有必要,PCM 转换器将 PCM 样本转换为流特定后处理模块支持的格式。
- 流子图的输出被馈入流-设备子图,该子图具有媒体格式转换器 (MFC)。MFC 将流子图 PCM 转换为设备子图 PCM 格式。
- 转换后,流-设备子图的输出被馈入设备 PP 子图以进行设备特定的后处理。子图开头放置了一个混音器以混合输入流。
- devicePP 子图的输出随后被馈入设备子图,该子图具有硬件端点模块(如 I2S 驱动)。
音频图管理器
音频图管理器 (AGM) 提供接口以允许基于 TinyALSA 的混音器控件以及 PCM/压缩插件进行交互并启用音频用例。AGM 作为在用户空间中运行的 PipeWire 服务的一部分运行。 AGM 为混音器插件和 PCM/压缩 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 软件块
后续步骤
- 高级音频功能 — 启用回声消除、噪声抑制和多设备播放
- Audio Addendum — 使用 QACT 和 QXDM 进行校准和诊断
- 故障排除音频 — 捕获并分析音频日志以解决问题

