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 -l

25.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 contents

25.2.3 声卡配置文件

# 全局 ALSA 配置
# /etc/asound.conf
 
# 用户 ALSA 配置
# ~/.asoundrc

设置默认声卡:

# ~/.asoundrc 或 /etc/asound.conf
defaults.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.conf
options 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.service

25.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-stereo

25.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-discover

25.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-recv

25.4 PipeWire(Arch 现代推荐)

PipeWire 是新一代多媒体框架,同时处理音频和视频流,在 Arch Linux 中已成为推荐的音频解决方案。

25.4.1 为什么选择 PipeWire

特性PulseAudioJACKPipeWire
桌面音频优秀不适合优秀
专业低延迟一般优秀优秀
视频流处理不支持不支持支持
蓝牙音频支持不支持支持(更好)
编解码器支持SBC/AACSBC/AAC/LDAC/AptX
沙箱应用支持有限原生支持
CPU 占用较高
兼容性PA APIJACK APIPA + 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.service

25.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 --version

25.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.conf
context.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.conf
monitor.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.conf
context.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 $USER

25.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
helvum

25.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.rules
ACTION=="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.lua

25.5.5 采样率与位深度

# 查看声卡支持的格式
cat /proc/asound/card0/pcm0p/sub0/hw_params
 
# 查看 PipeWire 当前配置
pw-metadata -n settings 0
 
# 设置高采样率
# ~/.config/pipewire/pipewire.conf.d/10-highres.conf
context.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 -L

25.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 1

25.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 -20

25.7 高级配置

25.7.1 均衡器

# 使用 EasyEffects(PipeWire 均衡器,推荐)
sudo pacman -S easyeffects
 
# EasyEffects 提供:
# - 参数均衡器
# - 压缩器/限制器
# - 混响
# - 降噪
# - 低音增强
# - 自动增益
 
# 命令行均衡器(PipeWire filter-chain)
# ~/.config/pipewire/pipewire.conf.d/20-equalizer.conf
context.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.conf
context.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.conf

25.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.conf
context.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.conf
pulse.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"
 }
]