🎧 在嵌入式 Linux 上配置 PulseAudio 默认输出设备的完整指南
引言
在嵌入式 Linux 平台(如 Firefly RK3588)中,音频系统通常由 ALSA 提供底层驱动支持,而 PulseAudio 作为用户空间音频服务器,负责混音、设备管理、音量控制等高级功能。为了实现稳定、可控的音频输出,正确配置 PulseAudio 的默认输出设备(sink)是关键步骤。
一、PulseAudio 简介
PulseAudio Sound Server 是一个跨平台的音频服务器,最初由 Lennart Poettering 开发,现已广泛用于 Linux 桌面和嵌入式系统。它运行在用户空间,提供以下功能:
- 多应用混音
- 网络音频传输
- 蓝牙音频支持
- 每用户音频隔离
- 动态设备管理
源码地址:PulseAudio GitLab 仓库
模块文档:PulseAudio 模块参考
配置说明:PulseAudio 配置文档
开发者入口:PulseAudio Developer Docs
二、查看当前输出设备(sink)
使用 pactl
命令列出所有可用的输出设备:
bash
pactl list short sinks
示例输出:
0 alsa_output.platform-bt-sound.stereo-fallback
1 alsa_output.platform-dp0-sound.stereo-fallback
2 alsa_output.platform-es8388-sound.stereo-fallback
3 alsa_output.platform-hdmi0-sound.stereo-fallback
4 combined
这些 sink 名称是设置默认输出的关键标识。
三、设置默认输出设备
✅ 临时设置(当前会话有效)
bash
pactl set-default-sink alsa_output.platform-es8388-sound.stereo-fallback
注意:不能使用数字编号如
#2
,必须使用完整的 sink 名称。
验证设置是否生效:
bash
pactl info | grep "Default Sink"
四、实现多声卡同时输出(合并 sink)
如果你希望多个声卡(如 HDMI 和 I2S)同时播放音频,可以使用 module-combine-sink
模块:
bash
pactl load-module module-combine-sink sink_name=combined slaves=alsa_output.platform-es8388-sound.stereo-fallback,alsa_output.platform-hdmi0-sound.stereo-fallback
pactl set-default-sink combined
这样创建的 combined
sink 会将音频同步输出到多个设备。
查看已加载模块:
bash
pactl list modules | grep combine
五、永久生效配置方式
✅ 修改系统配置文件 /etc/pulse/default.pa
在文件末尾添加:
ini
### Allow including a default.pa.d directory
.nofail
.include /etc/pulse/default.pa.d
load-module module-combine-sink sink_name=combined slaves=alsa_output.platform-es8388-sound.stereo-fallback,alsa_output.platform-hdmi0-sound.stereo-fallback
set-default-sink combined
推荐将模块加载和默认设置拆分为
/etc/pulse/default.pa.d/combined.pa
,便于维护。
修改后重启 PulseAudio:
bash
pulseaudio -k && pulseaudio --start
六、修复环境变量:解决 XDG_RUNTIME_DIR 报错
常见错误:
XDG_RUNTIME_DIR (/run/user/0) is not owned by us (uid 1000), but by uid 0!
Failed to acquire autospawn lock
原因:
- 当前用户 UID=1000(如 firefly),但环境变量错误地指向
/run/user/0
(root) - PulseAudio 拒绝跨 UID 连接,无法启动或控制音频服务
✅ 解决方法:
bash
export XDG_RUNTIME_DIR=/run/user/1000
pulseaudio --start
建议将其加入 .bashrc
:
bash
echo 'export XDG_RUNTIME_DIR=/run/user/1000' >> ~/.bashrc
七、嵌入式部署建议
项目 | 建议 |
---|---|
默认输出设置 | 使用 set-default-sink 指定 sink 名称 |
多声卡输出 | 使用 module-combine-sink 合并 sink |
持久化配置 | 修改 /etc/pulse/default.pa 或使用 .pa 片段 |
环境变量修复 | 设置正确的 XDG_RUNTIME_DIR ,避免 UID 冲突 |
自动启动 | 可用 systemd 用户服务或 .bashrc 脚本 |
验证工具 | 使用 pactl , aplay , ps , grep 等命令调试 |
八、常用命令速查
bash
# 查看 sink 列表
pactl list short sinks
# 设置默认 sink
pactl set-default-sink <sink_name>
# 查看当前默认 sink
pactl info | grep "Default Sink"
# 加载合并 sink 模块
pactl load-module module-combine-sink sink_name=combined slaves=<sink1>,<sink2>
# 查看已加载模块
pactl list modules | grep combine
# 修复环境变量
export XDG_RUNTIME_DIR=/run/user/1000