25 - 音频驱动配置
Linux 音频系统经历了从 OSS 到 ALSA、PulseAudio,再到 PipeWire 的演进。Arch Linux 作为滚动发行版,积极拥抱最新的 PipeWire 音频栈。本章将全面介绍 Linux 音频体系的各个层次,帮助你正确配置音频并解决常见问题。
25.1 Linux 音频栈演进
25.1.1 发展历程
OSS (1992) → ALSA (2002) → PulseAudio (2004) → PipeWire (2017)
↓ ↓ ↓ ↓
最早的音频框架 取代OSS成为 用户空间混音服务器 统一音频/视频
内核层面 内核标准 桌面音频管理 替代PA和JACK
25.1.2 各层次职责
| 层次 | 组件 | 职责 |
|---|---|---|
| 内核层 | ALSA | 硬件驱动、底层音频接口 |
| 用户空间服务 | PipeWire / PulseAudio | 混音、路由、设备管理 |
| 会话管理 | WirePlumber | 设备策略、自动路由 |
| 应用接口 | PulseAudio API / JACK API | 应用程序使用的 API |
25.1.3 现代 Arch Linux 音频栈
┌────────────────────────────────────────────────┐
│ 应用程序 │
│ (Firefox, mpv, Discord, OBS, Ardour ...) │
├──────────┬─────────────┬───────────────────────┤
│ PA API │ JACK API │ 原生 PipeWire API │
├──────────┴─────────────┴───────────────────────┤
│ PipeWire 守护进程 │
├────────────────────────────────────────────────┤
│ WirePlumber (会话管理) │
├────────────────────────────────────────────────┤
│ ALSA (内核驱动) │
├────────────────────────────────────────────────┤
│ 声卡硬件 │
└────────────────────────────────────────────────┘
25.2 ALSA 基础
ALSA(Advanced Linux Sound Architecture)是 Linux 内核的音频子系统,所有上层音频服务都建立在 ALSA 之上。
25.2.1 内核模块
# 查看已加载的声卡模块
lsmod | grep snd
# 常见的内核音频模块
# snd_hda_intel - Intel HDA 声卡(最常见)
# snd_hda_codec_* - HDA 编解码器
# snd_usb_audio - USB 声卡/音频接口
# snd_aloop - 虚拟回环设备
# snd_pcm - PCM 核心
# snd_mixer_oss - OSS 兼容层
# 查看检测到的声卡
cat /proc/asound/cards
# 输出示例:
# 0 [PCH ]: HDA-Intel - HDA Intel PCH
# HDA Intel PCH at 0xf7210000 irq 32
# 1 [HDMI ]: HDA-Intel - HDA ATI HDMI
# HDA ATI HDMI at 0xf7060000 irq 33
# 查看声卡详细信息
cat /proc/asound/card0/codec#0 | head -30
# 查看 PCM 设备
aplay -l
# 查看录音设备
arecord -l25.2.2 alsamixer 和 amixer
# 安装 ALSA 工具
sudo pacman -S alsa-utils
# 交互式音量控制(TUI 界面)
alsamixer
# F6 - 切换声卡
# F3 - 播放控制
# F4 - 录音控制
# F5 - 所有控制
# M - 静音/取消静音
# ↑↓ - 调节音量
# 命令行音量控制
# 查看所有控制项
amixer scontrols
# 设置主音量
amixer set Master 80%
amixer set Master 5%+
amixer set Master 5%-
# 静音/取消静音
amixer set Master toggle
# 设置特定声卡的音量
amixer -c 0 set Master 80%
# 查看详细信息
amixer -c 0 contents25.2.3 声卡配置文件
# 全局 ALSA 配置
# /etc/asound.conf
# 用户 ALSA 配置
# ~/.asoundrc设置默认声卡:
# ~/.asoundrc 或 /etc/asound.confdefaults.pcm.card 1
defaults.pcm.device 0
defaults.ctl.card 1
配置软件混音(dmix):
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 8192
rate 48000
}
bindings {
0 0
1 1
}
}
pcm.!default {
type plug
slave.pcm "dmixer"
}
25.2.4 声卡识别与切换
# 列出所有声卡
cat /proc/asound/cards
# 查看声卡模块绑定
cat /proc/asound/modules
# 设置声卡加载顺序(通过 modprobe 配置)
# /etc/modprobe.d/alsa.confoptions snd_hda_intel index=0
options snd_usb_audio index=1
# 使用 udev 规则固定声卡顺序
# /etc/udev/rules.d/90-alsa.rules
# 保存和恢复 ALSA 设置
alsactl store # 保存当前设置
alsactl restore # 恢复保存的设置
# 启用 ALSA 状态保存服务(自动保存/恢复)
sudo systemctl enable alsa-restore.service25.3 PulseAudio
虽然 PipeWire 已成为推荐方案,但了解 PulseAudio 仍然有价值。
25.3.1 架构与工作原理
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 应用 A │ │ 应用 B │ │ 应用 C │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└────────┬───────┴────────┬───────┘
│ │
┌──────┴──────────────┐│
│ PulseAudio Daemon ││
│ (混音、路由、均衡) ││
└──────┬──────────────┘│
│ │
┌──────┴──────┐ ┌─────┴──────┐
│ Sink 0 │ │ Sink 1 │
│ (扬声器) │ │ (耳机) │
└─────────────┘ └────────────┘
核心概念:
| 概念 | 说明 |
|---|---|
| Sink | 音频输出设备(扬声器、耳机) |
| Source | 音频输入设备(麦克风) |
| Sink Input | 连接到 Sink 的音频流(应用输出) |
| Source Output | 连接到 Source 的音频流(应用录音) |
| Module | 可加载的功能模块 |
| Card | 物理声卡 |
| Profile | 声卡的配置模式(立体声、环绕等) |
25.3.2 安装与基本使用
# 安装 PulseAudio(如果不使用 PipeWire)
sudo pacman -S pulseaudio pulseaudio-alsa
# 图形化音量控制
sudo pacman -S pavucontrol
# PulseAudio 自动随用户会话启动,无需手动启动
# 检查状态
pulseaudio --check
echo $? # 0 表示正在运行25.3.3 pactl 命令
# 列出所有 Sink(输出设备)
pactl list sinks short
# 列出所有 Source(输入设备)
pactl list sources short
# 列出正在播放的流
pactl list sink-inputs short
# 设置默认输出
pactl set-default-sink <sink_name>
# 设置音量(百分比)
pactl set-sink-volume @DEFAULT_SINK@ 80%
pactl set-sink-volume @DEFAULT_SINK@ +5%
pactl set-sink-volume @DEFAULT_SINK@ -5%
# 静音
pactl set-sink-mute @DEFAULT_SINK@ toggle
# 设置输入(麦克风)音量
pactl set-source-volume @DEFAULT_SOURCE@ 80%
# 移动应用音频到指定输出
pactl move-sink-input <sink_input_index> <sink_index>
# 加载/卸载模块
pactl load-module module-loopback
pactl unload-module <module_index>25.3.4 多声卡管理
# 列出所有声卡和配置文件
pactl list cards
# 设置声卡配置文件
pactl set-card-profile <card_index> <profile_name>
# 示例:切换到 HDMI 输出
pactl set-card-profile 0 output:hdmi-stereo
# 自动切换配置文件
# /etc/pulse/default.pa 中添加
# load-module module-switch-on-port-available
# 同时使用多个声卡输出
pactl load-module module-combine-sink \
sink_name=combined \
slaves=alsa_output.pci-0000_00_1f.3.analog-stereo,alsa_output.usb-device.analog-stereo25.3.5 蓝牙音频
# 安装蓝牙支持模块
sudo pacman -S pulseaudio-bluetooth
# 重启 PulseAudio
pulseaudio -k
pulseaudio --start
# 蓝牙设备连接后自动切换
# /etc/pulse/default.pa 中添加
# load-module module-bluetooth-policy
# load-module module-bluetooth-discover25.3.6 网络音频
# 发送端(服务器)配置
# /etc/pulse/default.pa 中添加
# load-module module-native-protocol-tcp auth-ip-acl=192.168.1.0/24
# 接收端(客户端)
# /etc/pulse/default.pa 中添加
# load-module module-tunnel-sink server=192.168.1.100
# 或通过 RTP 组播
# 发送端
# load-module module-rtp-send
# 接收端
# load-module module-rtp-recv25.4 PipeWire(Arch 现代推荐)
PipeWire 是新一代多媒体框架,同时处理音频和视频流,在 Arch Linux 中已成为推荐的音频解决方案。
25.4.1 为什么选择 PipeWire
| 特性 | PulseAudio | JACK | PipeWire |
|---|---|---|---|
| 桌面音频 | 优秀 | 不适合 | 优秀 |
| 专业低延迟 | 一般 | 优秀 | 优秀 |
| 视频流处理 | 不支持 | 不支持 | 支持 |
| 蓝牙音频 | 支持 | 不支持 | 支持(更好) |
| 编解码器支持 | SBC/AAC | 无 | SBC/AAC/LDAC/AptX |
| 沙箱应用支持 | 有限 | 无 | 原生支持 |
| CPU 占用 | 较高 | 低 | 低 |
| 兼容性 | PA API | JACK API | PA + JACK + 原生 |
25.4.2 安装与配置
# 安装 PipeWire 核心
sudo pacman -S pipewire pipewire-audio
# 安装 PulseAudio 兼容层(替代 pulseaudio)
sudo pacman -S pipewire-pulse
# 安装 JACK 兼容层(替代 jack2)
sudo pacman -S pipewire-jack
# 安装 ALSA 支持
sudo pacman -S pipewire-alsa
# 安装会话管理器
sudo pacman -S wireplumber
# 安装 GStreamer 插件(可选,用于编解码器)
sudo pacman -S gst-plugin-pipewire
# 如果之前安装了 PulseAudio,需要移除
sudo pacman -Rns pulseaudio pulseaudio-bluetooth pulseaudio-alsa
# PipeWire 通过 systemd 用户服务自动启动
# 通常不需要手动启用,桌面环境会自动处理
# 手动启用(如果需要)
systemctl --user enable pipewire.service
systemctl --user enable pipewire-pulse.service
systemctl --user enable wireplumber.service
# 启动
systemctl --user start pipewire.service
systemctl --user start pipewire-pulse.service
systemctl --user start wireplumber.service25.4.3 验证 PipeWire 运行状态
# 检查 PipeWire 是否正在运行
systemctl --user status pipewire
# 检查 PipeWire-Pulse 是否正在运行
systemctl --user status pipewire-pulse
# 确认 PulseAudio 接口由 PipeWire 提供
pactl info | grep "Server Name"
# 输出应包含: PulseAudio (on PipeWire x.x.x)
# 检查 JACK 接口
pw-jack jack_lsp
# 查看 PipeWire 版本
pw-cli --version25.4.4 替代 PulseAudio(pipewire-pulse)
pipewire-pulse 提供了完整的 PulseAudio 兼容接口,所有使用 PulseAudio API 的应用无需修改即可工作。
# 所有 pactl 命令照常使用
pactl list sinks short
pactl set-sink-volume @DEFAULT_SINK@ 80%
# pavucontrol 照常使用
pavucontrol
# 通过 PipeWire 原生工具也可以管理
# 列出所有设备
pw-cli list-objects | grep -E "(node|port)"
# 使用 wpctl(WirePlumber 控制工具)
wpctl status
wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.8
wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
wpctl inspect @DEFAULT_AUDIO_SINK@25.4.5 替代 JACK(pipewire-jack)
# 使用 pw-jack 包装器运行 JACK 应用
pw-jack ardour
pw-jack carla
pw-jack qjackctl
# 或设置全局 JACK 替代
# 安装 pipewire-jack 后,JACK 库会被替代
# JACK 设置可通过 PipeWire 配置
# ~/.config/pipewire/pipewire.conf.d/10-jack.confcontext.modules = [
{
name = libpipewire-module-rt
args = {
nice.level = -11
rt.prio = 88
}
}
]
25.4.6 WirePlumber 会话管理器
WirePlumber 是 PipeWire 的默认会话管理器,负责设备策略和自动路由。
# 查看 WirePlumber 状态
wpctl status
# 输出结构:
# Audio
# ├── Sinks:
# │ 46. Built-in Audio Analog Stereo [vol: 0.80]
# │ *47. USB Headset Analog Stereo [vol: 0.65]
# ├── Sources:
# │ *48. Built-in Audio Analog Stereo [vol: 1.00]
# ├── Sink endpoints:
# └── Source endpoints:
# 设置默认 Sink
wpctl set-default <id>
# 音量控制
wpctl set-volume <id> 0.8 # 设置为 80%
wpctl set-volume <id> 0.05+ # 增加 5%
wpctl set-volume <id> 0.05- # 减少 5%
# 静音
wpctl set-mute <id> toggle
# 查看设备详细信息
wpctl inspect <id>WirePlumber 配置目录结构:
# 全局配置
/usr/share/wireplumber/
# 用户自定义(覆盖全局)
~/.config/wireplumber/
# 配置文件结构
~/.config/wireplumber/
├── wireplumber.conf.d/
│ └── 50-custom.conf
├── main.lua.d/
│ └── 51-custom-rules.lua
└── policy.lua.d/
└── 50-endpoints-config.lua设备重命名示例:
# ~/.config/wireplumber/wireplumber.conf.d/51-rename.confmonitor.alsa.rules = [
{
matches = [
{ node.name = "alsa_output.pci-0000_00_1f.3.analog-stereo" }
]
actions = {
update-props = {
node.description = "笔记本内置扬声器"
}
}
}
]
25.4.7 低延迟配置
# PipeWire 默认的缓冲区大小和采样率
# 查看当前配置
pw-metadata -n settings 0
# 修改量子(buffer size)和采样率
# ~/.config/pipewire/pipewire.conf.d/10-lowlatency.confcontext.properties = {
default.clock.rate = 48000
default.clock.allowed-rates = [ 44100 48000 96000 ]
default.clock.quantum = 256
default.clock.min-quantum = 32
default.clock.max-quantum = 2048
}
# 量子与延迟的关系
# 延迟(ms) = quantum / sample_rate * 1000
# 256 / 48000 * 1000 ≈ 5.3ms
# 128 / 48000 * 1000 ≈ 2.7ms
# 64 / 48000 * 1000 ≈ 1.3ms
# 常见量子设置参考
# 量子 | 延迟 | 适用场景
# 1024 | ~21ms | 普通桌面使用
# 256 | ~5ms | 游戏、视频编辑
# 128 | ~2.7ms | 实时音频监听
# 64 | ~1.3ms | 专业低延迟录音
# 32 | ~0.7ms | 极限低延迟(CPU要求高)
# 实时优先级配置(需要 rtkit 或直接 RT 权限)
sudo pacman -S rtkit
# 或手动配置 RT 优先级
# /etc/security/limits.d/99-realtime.conf@audio - rtprio 95
@audio - memlock unlimited
@audio - nice -19
# 将用户添加到 audio 组
sudo usermod -aG audio $USER25.4.8 专业音频(录音、MIDI)
# 安装专业音频工具
sudo pacman -S ardour # DAW
sudo pacman -S carla # 插件宿主
sudo pacman -S qpwgraph # PipeWire 图形化路由工具
# MIDI 支持
sudo pacman -S pipewire-audio # 包含 MIDI 支持
# 查看 MIDI 设备
pw-cli list-objects | grep midi
# 使用 qpwgraph 进行音频/MIDI 路由
qpwgraph
# 使用 Helvum(另一个路由工具)
sudo pacman -S helvum
helvum25.5 常见问题
25.5.1 没有声音的排查步骤
# 第一步:检查基本状态
# 确认声卡被识别
aplay -l
# 确认 PipeWire 正在运行
systemctl --user status pipewire pipewire-pulse wireplumber
# 第二步:检查音量和静音
# 检查 PipeWire/PulseAudio 音量
wpctl status
pactl list sinks
# 检查 ALSA 音量(底层)
alsamixer
# 确保 Master 和 PCM 未被静音(MM 表示静音)
# 第三步:检查设备选择
# 确认使用了正确的输出设备
wpctl status
# 带 * 号的是当前默认设备
# 第四步:测试音频输出
speaker-test -c 2 -t wav
# 第五步:检查内核日志
dmesg | grep -iE "(snd|audio|sound|codec)"
# 第六步:重启音频服务
systemctl --user restart pipewire pipewire-pulse wireplumber
# 第七步:检查是否有进程独占设备
fuser -v /dev/snd/*25.5.2 HDMI 音频
# HDMI 音频通常由显卡驱动提供
aplay -l | grep HDMI
# 设置 HDMI 为默认输出
# 找到 HDMI sink
pactl list sinks short | grep hdmi
# 设置默认
pactl set-default-sink <hdmi_sink_name>
# 或使用 wpctl
wpctl set-default <hdmi_sink_id>
# 如果 HDMI 音频不可用
# Intel 显卡:确认 i915 模块加载了 audio 组件
lsmod | grep snd_hda_intel
# 确认 enable_hda_codec 参数
modinfo i915 | grep audio
# NVIDIA:确认 nvidia-drm 已加载
lsmod | grep nvidia_drm
# AMD:amdgpu 自动处理 HDMI 音频25.5.3 USB 声卡
# 查看 USB 音频设备
lsusb | grep -i audio
aplay -l | grep USB
# USB 声卡通常即插即用
# 如果不工作,检查内核日志
dmesg | grep -i usb.*audio
# 设置 USB 声卡为默认
# 找到设备名称
pactl list sinks short
# 设置默认
pactl set-default-sink <usb_sink_name>
# 使用 udev 规则自动设置
# /etc/udev/rules.d/91-usb-audio.rulesACTION=="add", SUBSYSTEM=="sound", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", \
RUN+="/usr/bin/su user -c '/usr/bin/pactl set-default-sink alsa_output.usb-xxx'"25.5.4 耳机/扬声器自动切换
# PipeWire/WirePlumber 通常自动处理耳机插拔切换
# 如果不工作,检查 jack detection
# 查看 jack 状态
cat /proc/asound/card0/codec#0 | grep -A 2 "Jack"
# 确认 WirePlumber 的自动切换策略
# 默认配置位于 /usr/share/wireplumber/main.lua.d/
# 手动配置自动切换策略
# ~/.config/wireplumber/policy.lua.d/50-auto-switch.lua25.5.5 采样率与位深度
# 查看声卡支持的格式
cat /proc/asound/card0/pcm0p/sub0/hw_params
# 查看 PipeWire 当前配置
pw-metadata -n settings 0
# 设置高采样率
# ~/.config/pipewire/pipewire.conf.d/10-highres.confcontext.properties = {
default.clock.rate = 96000
default.clock.allowed-rates = [ 44100 48000 96000 192000 ]
}
# 常见音频格式参考
# 格式 | 位深度 | 采样率 | 说明
# CD 品质 | 16-bit | 44100 Hz | 标准 CD 音频
# DVD 品质 | 24-bit | 48000 Hz | DVD / 蓝光
# Hi-Res | 24-bit | 96000 Hz | 高解析度音频
# 极致 Hi-Res | 32-bit | 192000 Hz | 录音棚级别25.6 音频调试工具
25.6.1 aplay 和 arecord
# 播放测试音(使用 ALSA 直接播放)
aplay -D default /usr/share/sounds/alsa/Front_Center.wav
# 指定设备和格式播放
aplay -D hw:0,0 -f cd test.wav
# 录音
arecord -f cd -d 10 -t wav test_recording.wav
# 列出所有 PCM 设备
aplay -L
arecord -L25.6.2 speaker-test
# 双声道测试
speaker-test -c 2 -t wav
# 5.1 环绕测试
speaker-test -c 6 -t wav
# 指定设备测试
speaker-test -D default -c 2 -t sine -f 440
# 持续测试(1000Hz 正弦波)
speaker-test -c 2 -t sine -f 1000 -l 125.6.3 PipeWire 专用工具
# pw-top:实时监控 PipeWire 节点
pw-top
# 显示各节点的采样率、量子、负载等
# pw-dump:导出完整的 PipeWire 状态(JSON 格式)
pw-dump
pw-dump | jq '.[] | select(.type == "PipeWire:Interface:Node")'
# pw-cli:PipeWire 命令行客户端
pw-cli ls Node # 列出所有节点
pw-cli info <id> # 查看节点详情
pw-cli enum-params <id> Props # 查看节点属性
# pw-mon:监控 PipeWire 事件
pw-mon
# pw-cat:PipeWire 版本的 aplay/arecord
pw-play test.wav
pw-record -r 48000 --format f32 output.wav
# pw-link:管理节点间的链接
pw-link -o # 列出输出端口
pw-link -i # 列出输入端口
pw-link <output_port> <input_port> # 建立连接
# wpctl:WirePlumber 控制
wpctl status # 总览
wpctl set-default <id> # 设置默认设备
wpctl set-volume <id> 0.8 # 设置音量
wpctl set-mute <id> toggle # 切换静音
wpctl inspect <id> # 详细信息
wpctl get-volume @DEFAULT_AUDIO_SINK@ # 获取默认输出音量25.6.4 综合调试脚本
#!/bin/bash
echo "=== 声卡列表 ==="
aplay -l
echo -e "\n=== PipeWire 状态 ==="
systemctl --user status pipewire --no-pager
echo -e "\n=== PipeWire-Pulse 状态 ==="
systemctl --user status pipewire-pulse --no-pager
echo -e "\n=== WirePlumber 状态 ==="
systemctl --user status wireplumber --no-pager
echo -e "\n=== pactl info ==="
pactl info
echo -e "\n=== Sink 列表 ==="
pactl list sinks short
echo -e "\n=== Source 列表 ==="
pactl list sources short
echo -e "\n=== wpctl 状态 ==="
wpctl status
echo -e "\n=== 内核音频模块 ==="
lsmod | grep snd
echo -e "\n=== 内核日志(音频相关)==="
dmesg | grep -iE "(snd|audio|sound)" | tail -2025.7 高级配置
25.7.1 均衡器
# 使用 EasyEffects(PipeWire 均衡器,推荐)
sudo pacman -S easyeffects
# EasyEffects 提供:
# - 参数均衡器
# - 压缩器/限制器
# - 混响
# - 降噪
# - 低音增强
# - 自动增益
# 命令行均衡器(PipeWire filter-chain)
# ~/.config/pipewire/pipewire.conf.d/20-equalizer.confcontext.modules = [
{
name = libpipewire-module-filter-chain
args = {
node.description = "Equalizer"
media.name = "Equalizer"
filter.graph = {
nodes = [
{
type = builtin
name = eq_band_1
label = bq_lowshelf
control = { "Freq" = 100.0 "Q" = 1.0 "Gain" = 6.0 }
}
{
type = builtin
name = eq_band_2
label = bq_peaking
control = { "Freq" = 1000.0 "Q" = 1.0 "Gain" = 0.0 }
}
{
type = builtin
name = eq_band_3
label = bq_highshelf
control = { "Freq" = 8000.0 "Q" = 1.0 "Gain" = 3.0 }
}
]
links = [
{ output = "eq_band_1:Out" input = "eq_band_2:In" }
{ output = "eq_band_2:Out" input = "eq_band_3:In" }
]
}
audio.channels = 2
audio.position = [ FL FR ]
capture.props = {
node.name = "effect_input.eq"
media.class = Audio/Sink
}
playback.props = {
node.name = "effect_output.eq"
}
}
}
]
25.7.2 降噪
# 使用 EasyEffects 的降噪功能
# 或使用 PipeWire filter-chain + RNNoise
# 安装 RNNoise 降噪库
sudo pacman -S rnnoise
# ~/.config/pipewire/pipewire.conf.d/20-rnnoise.confcontext.modules = [
{
name = libpipewire-module-filter-chain
args = {
node.description = "Noise Canceling source"
media.name = "Noise Canceling source"
filter.graph = {
nodes = [
{
type = ladspa
name = rnnoise
plugin = librnnoise_ladspa
label = noise_suppressor_mono
control = {
"VAD Threshold (%)" = 50.0
"VAD Grace Period (ms)" = 200
"Retroactive VAD Grace (ms)" = 0
}
}
]
}
audio.rate = 48000
audio.channels = 1
audio.position = [ MONO ]
capture.props = {
node.name = "capture.rnnoise_source"
node.passive = true
media.class = Audio/Sink
}
playback.props = {
node.name = "rnnoise_source"
media.class = Audio/Source
}
}
}
]
25.7.3 虚拟环绕声
# 使用 PipeWire filter-chain 创建虚拟环绕声
# 安装 SoX LADSPA 插件
sudo pacman -S ladspa swh-plugins
# 使用 EasyEffects 提供的 Crossfeed(耳机虚拟环绕)
# 或使用 HeSuVi 预设
# 创建虚拟 5.1 声道 Sink
# ~/.config/pipewire/pipewire.conf.d/20-virtual-surround.conf25.7.4 音频回环(监听自己的麦克风)
# 使用 PipeWire
pw-link <source_output> <sink_input>
# 使用 pactl
pactl load-module module-loopback source=<source_name> sink=<sink_name> latency_msec=20
# 使用 PipeWire 的 loopback 模块
# ~/.config/pipewire/pipewire.conf.d/20-loopback.confcontext.modules = [
{
name = libpipewire-module-loopback
args = {
audio.position = [ FL FR ]
capture.props = {
media.class = Audio/Sink
node.name = "loopback_sink"
node.description = "Loopback"
}
playback.props = {
node.name = "loopback_output"
node.description = "Loopback Output"
}
}
}
]
25.7.5 多用户音频共享
# PipeWire 默认是每用户实例
# 如果需要多用户共享音频,可以使用系统级 PipeWire
# 注意:这通常不推荐,仅在特殊场景下使用
# 使用网络透明功能
# 启用 PulseAudio TCP 模块(通过 pipewire-pulse)
# ~/.config/pipewire/pipewire-pulse.conf.d/10-network.confpulse.cmd = [
{
cmd = "load-module"
args = "module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.0/24"
}
{
cmd = "load-module"
args = "module-zeroconf-publish"
}
]