WirePlumber

来自 ArchWiki

WirePlumber 是一个强大的会话和策略管理器,用于 PipeWire。它基于模块化设计,使用 Lua 插件来实现实际的管理功能,因此具有高度的可配置性和可扩展性。

安装

安装 wireplumber 软件包。任何冲突的 PipeWire 会话管理器都将被卸载。

WirePlumber 使用 systemd 用户单元 来管理服务器。

配置

此文章或章节已过时。

原因: WirePlumber 的配置格式正在更改。[1] (在 ArchWiki talk:Requests#Update for new WirePlumber configuration format 中讨论)

配置文件布局

WirePlumber 的配置 包括全局 PipeWire 风格的 JSON 对象,例如 contextalsa_monitor,这些对象被修改以更改其行为。配置文件从 ~/.config/wireplumber/ (用户配置)、/etc/wireplumber/ (全局配置) 和 /usr/share/wireplumber/ (stock 配置) 中读取。

WirePlumber 首先读取 主配置文件。这是一个类似 JSON 的文件,用于设置 PipeWire 上下文、SPA 插件、模块和组件。在这些组件中,有 Lua 脚本引擎,用于动态修改全局对象。

软件包附带了不同的主配置文件

  • 单实例配置文件,位于 /usr/share/wireplumber/wireplumber.conf。这是默认配置,其中包含一个进程中所有其他配置的功能。
  • 主配置文件,位于 /usr/share/wireplumber/main.conf。它加载 WirePlumber 核心所需的模块和组件,并从 config-dir/main.lua.d/ 加载 Lua 配置文件[死链接 2024-01-13 ⓘ][2][死链接 2024-01-13 ⓘ]
  • 蓝牙 配置文件,位于 /usr/share/wireplumber/bluetooth.conf。这适用于处理核心进程的蓝牙连接的 WirePlumber 进程。它从 config-dir/bluetooth.lua.d/ 加载 Lua 文件。
  • 策略 配置文件,位于 /usr/share/wireplumber/policy.conf。它封装了策略功能,即 WirePlumber 如何决定移动节点和更改节点。它从 config-dir/policy.lua.d/ 加载 Lua 文件。

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 或以下完成。
    • 请注意,WirePlumber 执行 多路径合并[死链接 2024-01-13 ⓘ],这意味着编号较低的 stock 配置将在您的新脚本之前运行,因为字母数字排序优先于目录优先级。
  • 您选择的目录应与 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]
 │
 └─ ...

接口 ID48

然后使用 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.namenode.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 显示当前正在使用的 PipeWire DeviceNode
  • 来自 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.disablednode.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.* 的名称,请参阅 #获取用于规则匹配的接口名称

注意: 常见的用例,例如,是禁用 NVIDIA 的 HDMI 音频输出。

设置节点优先级

要更改自动选择哪个音频接收器或音频源,您需要设置其 priority.driverpriority.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 statuswpctl 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 以将以下命令绑定到您的音量键:XF86AudioRaiseVolumeXF86AudioLowerVolumeXF86AudioMuteXF86AudioMicMute

要提高音量,限制为 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#自动配置文件选择

在注销后保持蓝牙运行 / 无头蓝牙

注意: 您还需要为运行 PipeWire/Wireplumber 的用户启用 lingering

自 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#故障排除 中找到。

参见