WirePlumber
WirePlumber 是一个强大的会话和策略管理器,用于 PipeWire。它基于模块化设计,使用 Lua 插件来实现实际的管理功能,因此具有高度的可配置性和可扩展性。
安装
安装 wireplumber 软件包。任何冲突的 PipeWire 会话管理器都将被卸载。
WirePlumber 使用 systemd 用户单元 来管理服务器。
配置
配置文件布局
WirePlumber 的配置 包括全局 PipeWire 风格的 JSON 对象,例如 context 和 alsa_monitor,这些对象被修改以更改其行为。配置文件从 ~/.config/wireplumber/ (用户配置)、/etc/wireplumber/ (全局配置) 和 /usr/share/wireplumber/ (stock 配置) 中读取。
WirePlumber 首先读取 主配置文件。这是一个类似 JSON 的文件,用于设置 PipeWire 上下文、SPA 插件、模块和组件。在这些组件中,有 Lua 脚本引擎,用于动态修改全局对象。
软件包附带了不同的主配置文件
- 单实例配置文件,位于
/usr/share/wireplumber/wireplumber.conf。这是默认配置,其中包含一个进程中所有其他配置的功能。- 请参阅 “context” 对象的文档[死链接 2024-07-30 ⓘ],该对象在所有主配置文件中使用。
- 主配置文件,位于
/usr/share/wireplumber/main.conf。它加载 WirePlumber 核心所需的模块和组件,并从config-dir/main.lua.d/加载 Lua 配置文件[死链接 2024-01-13 ⓘ]。[2][死链接 2024-01-13 ⓘ]- 请参阅 ALSA 对象 和 “access” 对象 的文档。
- 蓝牙 配置文件,位于
/usr/share/wireplumber/bluetooth.conf。这适用于处理核心进程的蓝牙连接的 WirePlumber 进程。它从config-dir/bluetooth.lua.d/加载 Lua 文件。- 请参阅 蓝牙对象的文档。
- 策略 配置文件,位于
/usr/share/wireplumber/policy.conf。它封装了策略功能,即 WirePlumber 如何决定移动节点和更改节点。它从config-dir/policy.lua.d/加载 Lua 文件。- 请参阅 与策略相关的对象的文档[死链接 2024-07-30 ⓘ]。
lua.d/ 目录中的 Lua 配置文件也从 config-dir/scripts/ 加载 Lua 脚本。这些脚本实现了 Pipewire 的一些逻辑/功能,在某些情况下也值得修改。
修改配置
配置 WirePlumber 的推荐方法是在 /etc/wireplumber/ 或 ~/.config/wireplumber/ 中的相应 wireplumber.conf.d/ 目录中添加 SPA-JSON 文件。需要考虑的一些事项是
- 如果要覆盖现有配置,请将其从
/usr/share/wireplumber/复制到目标位置,同时保持其名称相同。名称相同但在优先级较低位置的配置文件将被忽略。[3][死链接 2024-01-13 ⓘ] - 否则,如果要添加新配置,则应以大于 50 的数字 (例如
51-my-config.conf) 开头,因为默认配置主要在字母数字排序中的 50 或以下完成。 - 您选择的目录应与 stock 配置执行的操作一致,但这并不严格重要,除非您 使用多个实例[死链接 2024-01-13 ⓘ]。
- 蓝牙设备的 ALSA 属性必须在
wireplumber.conf.d/中配置。自 0.5 版本起,不再需要单独的bluetooth.lua.d/目录。
获取用于规则匹配的接口名称
在 Lua 脚本中,您需要使用要配置的接口的 对象 中的属性指定 matches 规则。
使用命令 wpctl status 显示 WirePlumber 管理的所有对象。找到分配给目标接口的 ID。然后使用命令 wpctl inspect ID 获取所需的属性。
示例,如果您的目标接口是 HD Audio Controller Analog Stereo 并考虑以下输出
$ wpctl status
PipeWire 'pipewire-0' [0.3.56, user@hostname, cookie:1163266174] Audio ├─ Devices: │ 42. HD Audio Controller [alsa] │ 105. USB PnP Audio Device [alsa] │ ├─ Sinks: │ * 48. HD Audio Controller Analog Stereo [vol: 0.50] │ ├─ ... │ ├─ Sources: │ * 101. USB PnP Audio Device Mono [vol: 0.74] │ └─ ...
接口 ID 是 48。
然后使用 inspect 命令查看对象详细信息,列出该对象中的所有属性
$ wpctl inspect 48
id 48, type PipeWire:Interface:Node
...
device.api = "alsa"
device.class = "sound"
* device.id = "42"
device.profile.description = "Analog Stereo"
device.profile.name = "analog-stereo"
...
* factory.id = "18"
factory.mode = "merge"
factory.name = "api.alsa.pcm.sink"
...
* media.class = "Audio/Sink"
* node.description = "HD Audio Controller Analog Stereo"
* node.name = "alsa_output.pci-0000_08_00.4.analog-stereo"
* node.nick = "ALC1220 Analog"
...
* object.path = "alsa:pcm:1:front:1:playback"
* object.serial = "49"
...
选择 device.name 或 node.name 属性与 Lua 配置文件中的 matches 规则一起使用。
避免使用 device.id,它是动态的且经常更改。
matches 规则中可以使用多个属性,请参阅 WirePlumber ALSA 配置文档中的 alsa_monitor.rules 部分。
- 您可以从
media.class属性确定此对象的Endpoint类。 - 对于 ALSA,
node对象是音频接收器或音频源 /device对象对应于声卡。 - 自 v0.4.9 起,ALSA 节点使用 PCM 名称填充
node.nick,这至少在使用 UCM 的 HDA 声卡上很有用,其中所有输出 (模拟、HDMI 等) 都作为单个配置文件上的Node公开。
- 命令
pw-top显示当前正在使用的 PipeWireDevice和Node。 - 来自 PipeWire 的类似检查命令是
pw-cli info ID。
更改设备/节点属性
要更改设备或节点属性,例如其描述或昵称,您必须创建一个 SPA-JSON 文件,并将其添加到 /etc/wireplumber/ 或 ~/.config/wireplumber/ 下的正确路径和名称中。
例如,要更改 ALSA 节点的描述,您可以创建一个类似如下的文件
/etc/wireplumber/wireplumber.conf.d/51-device-rename.conf (or ~/.config/wireplumber/wireplumber.conf.d/51-device-rename.conf)
monitor.alsa.rules = [
{
matches = [
{
node.name = "alsa_output.pci-0000_00_1f.3.output_analog-stereo"
}
]
actions = {
update-props = {
node.description = "Laptop"
}
}
}
]
如果您希望更改蓝牙节点或设备上的某些内容,您可以创建一个类似如下的文件
/etc/wireplumber/wireplumber.conf.d/52-bluez-rename.conf (or ~/.config/wireplumber/wireplumber.conf.d/52-bluez-rename.conf)
monitor.bluez.rules = [
{
matches = [
{
node.name = "bluez_output.02_11_45_A0_B3_27.a2dp-sink"
}
]
actions = {
update-props = {
node.nick = "Headphones"
}
}
}
]
您可以更改的属性以及用于选择设备或节点的匹配规则在 ALSA 配置 和 蓝牙配置 中有文档记录。
禁用设备/节点
自 WirePlumber v0.4.7 起,用户现在可以通过属性 device.disabled 或 node.disabled 禁用任何设备或节点
/etc/wireplumber/wireplumber.conf.d/51-alsa-disable.conf (or ~/.config/wireplumber/wireplumber.conf.d/51-alsa-disable.conf)
monitor.alsa.rules = [
{
matches = [
{
device.name = "alsa_card.pci-0000_08_00.4"
}
]
actions = {
update-props = {
device.disabled = true
}
}
}
]
有关系统中 alsa_card.* 的名称,请参阅 #获取用于规则匹配的接口名称。
设置节点优先级
要更改自动选择哪个音频接收器或音频源,您需要设置其 priority.driver 和 priority.session 值
/etc/wireplumber/wireplumber.conf.d/52-set-priorities.conf
monitor.alsa.rules = [
{
matches = [
{
node.name = "alsa_output.usb-Generic_USB_Audio-00.HiFi__Speaker__sink"
}
]
actions = {
update-props = {
priority.driver = 100
priority.session = 100
}
}
}
]
此示例将 Asus B650E-F 主板上的板载音频的扬声器输出音频接收器的优先级设置为 100,从原始值 1000 降低。因此,其他输出音频接收器,例如板载音频设备的 S/PDIF 输出或插入的耳机,将因其较高的优先级而被默认选择,而不是模拟扬声器输出。
在同一声卡上同时输出到多个音频接收器
请参阅 PipeWire#在同一声卡上同时输出到多个音频接收器。
同时输出到瞬态设备
您可能希望同时将声音输出到板载设备和外部设备 - 即使外部设备并非始终插入。为了实现这一点,我们创建一个虚拟节点,它将始终存在,无论插入什么硬件。然后,每当瞬态硬件 (在本例中为 USB 耳机) 插入时,我们将其链接到虚拟节点。
首先创建一个在登录期间运行的脚本 (这通常最容易通过窗口管理器的启动功能完成)。
/usr/local/sbin/create-virtual-sink.sh
#!/bin/bash
# Create a new sink called Simultaneous Output
pw-cli create-node adapter '{ factory.name=support.null-audio-sink node.name="Simultaneous Output" node.description="Simultaneous Output" media.class=Audio/Sink object.linger=true audio.position=[FL FR] }'
# Connect the normal permanent sound card output to the new sink
pw-link "Simultaneous Output:monitor_FL" alsa_output.pci-0000_05_04.0.analog-stereo:playback_FL
pw-link "Simultaneous Output:monitor_FR" alsa_output.pci-0000_05_04.0.analog-stereo:playback_FR
# Switch the default output to the new virtual sink
wpctl set-default `wpctl status | grep "\. Simultaneous Output" | egrep '^ │( )*[0-9]*' -o | cut -c6-55 | egrep -o '[0-9]*'`
在上面的示例中,最初唯一的输出设备是我们的“正常”板载声卡 (alsa_output.pci-0000_05_04.0.analog-stereo)。您可以通过运行 wpctl status 和 wpctl inspect 来查找您的声卡的设计器。
当您的 USB 耳机插入时,运行以下脚本以将它们链接到虚拟音频接收器
link-virtual-sink-headphones.sh
#!/bin/bash # link the virtual sync to your headphones should run when detected by UDEV # wait a second for the drivers to load sleep 1s # link the headphones to your virtual sink sudo -u user1 env XDG_RUNTIME_DIR=/run/user/1000 pw-link "Simultaneous Output:monitor_FL" alsa_output.usb-Kingston_HyperX_Cloud_Flight_S_000000000001-00.analog-stereo:playback_FL sudo -u user1 env XDG_RUNTIME_DIR=/run/user/1000 pw-link "Simultaneous Output:monitor_FR" alsa_output.usb-Kingston_HyperX_Cloud_Flight_S_000000000001-00.analog-stereo:playback_FR # finish and return the code for success exit 0
理想情况下,您会在耳机插入时自动运行此脚本。Udev 页面上的说明描述了如何为此创建自定义规则。(但请注意,您不能直接运行此脚本 - 因为 UDEV 在任何指定的脚本运行之后才会加载驱动程序。因此,您将必须有一个中间脚本,其中包含一些 nohup 技巧或类似的东西)。您还需要修改上面的脚本,以便 XDG_RUNTIME_DIR 与您的用户 ID 号码匹配,并且 user1 需要替换为您的用户名。
您可以以相同的方式向此虚拟音频接收器添加任意数量的设备。
如果您在跟踪哪些设备连接到哪里时遇到问题,qpwgraph 工具非常适合获得设备之间连接方式的可视化表示。
技巧和窍门
删除损坏的设置
如果 WirePlumber 的设置已损坏,则可以删除所有用户设置
$ systemctl --user stop wireplumber.service $ rm -r ~/.local/state/wireplumber # deletes settings $ systemctl --user start wireplumber.service
键盘音量控制
请参阅 键盘快捷键#Xorg 以将以下命令绑定到您的音量键:XF86AudioRaiseVolume、XF86AudioLowerVolume、XF86AudioMute 和 XF86AudioMicMute。
要提高音量,限制为 150%
$ wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+
要降低音量
$ wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
静音/取消静音音量
$ wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
静音/取消静音麦克风
$ wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
wpctl status 以列出所有可用的音频接收器,并在 @DEFAULT_AUDIO_SINK@ 或 _SOURCE@ 的位置使用音频接收器或音频源编号。显示音量级别
要获取默认音频接收器的音量级别和静音状态
$ wpctl get-volume @DEFAULT_AUDIO_SINK@
Volume: 0.45
禁用蓝牙配置文件自动切换
请参阅 PipeWire#自动配置文件选择。
在注销后保持蓝牙运行 / 无头蓝牙
自 0.4.8 起,必须禁用 support.logind 以进行 bluez 座位监控。
~/.config/wireplumber/wireplumber.conf.d/80-disable-logind.conf
wireplumber.profiles = {
main = {
monitor.bluez.seat-monitoring = disabled
}
}
禁用音频堆栈集成
如果您不希望 PipeWire/Wireplumber 接管对您的音频设备的控制,因为您选择使用不同的音频解决方案 (例如 PulseAudio/JACK/ALSA),但仍然希望它可用于屏幕共享/视频目的,您可以利用 wireplumber@.service 模板单元 来启用一组不同的默认配置文件。Wireplumber 附带一个配置文件配置,该配置仅启用视频部分并禁用音频集成 (包括蓝牙音频),方法是启用 video-only 模板 用户单元。
禁用 wireplumber.service 用户单元 并 启用 wireplumber@video-only.service 用户单元。
故障排除
由于 WirePlumber 仅用于管理 PipeWire 会话,因此 WirePlumber 相关的修复程序可能在 PipeWire#故障排除 中找到。
参见
- 文档 — 官方文档
- WirePlumber,PipeWire 会话管理器 — George Kiagiadakis (Collabora) 于 2020 年 5 月发布的博客文章,详细介绍了 WirePlumber 的工作原理