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 的工作原理