WirePlumber (Русский)
WirePlumber — это мощный менеджер сеансов и политик для PipeWire. Основанный на модульном дизайне, с плагинами Lua, реализующими фактическую функциональность управления, он обладает высокой настраиваемостью и расширяемостью.
Установка
Установите пакет wireplumber. Он конфликтует с пакетами других менеджеров сеансов PipeWire, что гарантирует, что они будут удалены.
WirePlumber использует пользовательский экземпляр systemd для управления сервером.
Настройка
Расположение файлов настроек
Конфигурация WirePlumber[устаревшая ссылка 2024-01-13 ⓘ] состоит из глобальных JSON-подобных объектов, похожих на объекты из конфигурации PipeWire, таких как context
и alsa_monitor
. Настройки считываются из каталогов ~/.config/wireplumber/
(пользовательская конфигурация), /etc/wireplumber/
(глобальная конфигурация) и /usr/share/wireplumber/
(конфигурация по умолчанию).
WirePlumber начинает работу с чтения основного файла настроек[устаревшая ссылка 2024-01-13 ⓘ]. Это JSON-подобный файл, который настраивает контекст PipeWire, SPA-плагины, модули и компоненты. Среди этих компонентов есть и Lua, который используется для динамического изменения глобальных объектов.
Есть несколько разных основных файлов настроек, поставляемых вместе с пакетом:
- Настройки для одиночного экземпляра —
/usr/share/wireplumber/wireplumber.conf
. Это конфигурация по умолчанию, которая включает в себя функциональность всех других конфигураций в рамках одного процесса.- Смотрите документацию объекта «context»[устаревшая ссылка 2024-01-13 ⓘ], который используется во всех основных файлах настроек.
- Основной файл настроек —
/usr/share/wireplumber/main.conf
. Он загружает модули и компоненты, необходимые для ядра WirePlumber, а также загружает скрипты Lua[устаревшая ссылка 2024-01-13 ⓘ] изкаталог-настроек/main.lua.d/
. [1][устаревшая ссылка 2024-01-13 ⓘ]- Смотрите документацию объектов ALSA[устаревшая ссылка 2024-01-13 ⓘ] и объектов «access»[устаревшая ссылка 2024-01-13 ⓘ].
- Файл настроек Bluetooth —
/usr/share/wireplumber/bluetooth.conf
. Он может использоваться для отдельного процесса WirePlumber, который обрабатывает подключения Bluetooth для основного процесса. При этом загружаются файлы Lua изкаталог-настроек/bluetooth.lua.d/
.- Смотрите документацию объекта Bluetooth[устаревшая ссылка 2024-01-13 ⓘ].
- Файл настроек policy —
/usr/share/wireplumber/policy.conf
. В нём содержится функциональность политики, с помощью которой WirePlumber принимает решения о перемещении и внесении изменений в узлы. При этом загружаются файлы Lua изкаталог-настроек/policy.lua.d/
- Смотрите документацию объектов, связанных с политиками[устаревшая ссылка 2024-01-13 ⓘ].
Lua-скрипты из каталогов lua.d/
также загружают другие Lua-скрипты из каталог-настроек/scripts/
. Эти скрипты реализуют некоторые логические/функциональные возможности Pipewire и могут быть полезны при определённых обстоятельствах.
Изменение настроек
Рекомендуемый способ для настройки WirePlumber — добавить Lua-скрипт в соответствующий каталог lua.d/
в /etc/wireplumber/
или ~/.config/wireplumber/
. Следует учесть следующие моменты:
- Если вы хотите создать скрипт, который полностью заменит собой стандартный скрипт, скопируйте его из
/usr/share/wireplumber/
в место назначения с тем же самым именем. Будет прочитан только самый приоритетный файл; файлы с таким же именем из менее приоритетных каталогов будут проигнорированы. [2][устаревшая ссылка 2024-01-13 ⓘ] - В противном случае, если вы хотите добавить новый скрипт, в начале его имени укажите номер больше 50 (например,
51-my-config.lua
), так как настройки по умолчанию в основном содержатся на уровне 50 или ниже.- Имейте в виду, что WirePlumber выполняет multi-path merging[устаревшая ссылка 2024-01-13 ⓘ], а это значит, что стандартные настройки с более низким номером будут прочитаны раньше вашего нового скрипта, так как файлы настроек сортируются по их именам.
- Выбранный вами каталог должен соответствовать тому, что делает конфигурация по умолчанию, но это не имеет особого значения, если вы не используете несколько экземпляров[устаревшая ссылка 2024-01-13 ⓘ].
- Свойства ALSA для устройств Bluetooth должны быть настроены в файле
bluetooth.lua.d/
. Свойства, заданные вmain.lua.d/
, не применятся.
Получение имени интерфейса для правил matches
Выбор настраиваемого интерфейса в Lua-скриптах WirePlumber выполняется с помощью правил matches
, в которых прописываются свойства PipeWire-объектов и их значения, по которым будет выполняться выборка.
Используйте команду wpctl status
, чтобы посмотреть все объекты, которыми управляет WirePlumber. Найдите ID
нужного вам интерфейса.
Пример вывода команды:
$ wpctl status
PipeWire 'pipewire-0' [0.3.56, user@hostname, cookie:1163266174] └─ Clients: 32. pipewire-pulse [0.3.56, user@hostname, pid:895] 33. WirePlumber [0.3.56, user@hostname, pid:894] ... Audio ├─ Devices: │ 42. HD Audio Controller [alsa] │ 105. USB PnP Audio Device [alsa] │ ├─ Sinks: │ * 48. HD Audio Controller Analog Stereo [vol: 0.50] │ 53. EasyEffects Sink [vol: 1.00] │ ├─ ... │ ├─ Sources: │ 54. EasyEffects Source [vol: 1.00] │ * 101. USB PnP Audio Device Mono [vol: 0.74] │ └─ ... Video └─ ... Settings └─ Default Configured Node Names: 0. Audio/Sink alsa_output.pci-0000_08_00.4.analog-stereo 1. Audio/Source alsa_input.usb-0c76_USB_PnP_Audio_Device-00.mono-fallback
Например, если нужен интерфейс HD Audio Controller Analog Stereo
, то здесь его ID
— 48
.
Теперь с помощью команды wpctl inspect ID
можно посмотреть список всех доступных свойств этого объекта:
$ wpctl inspect 48
id 48, type PipeWire:Interface:Node ... * client.id = "34" 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" library.name = "audioconvert/libspa-audioconvert" * 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
и node.nick
для последующего использования в правилах matches
в Lua-скрипте.
Не используйте device.id
, так как он динамический и часто меняется.
wpctl inspect
показывает тип объекта в первой строке, то естьtype PipeWire:Interface:Node
означает, что тип этого объектаNode
.- Объекты
Node
— это источники (sources) или выводы (sinks) в графе PipeWire, а объектыDevice
соответствуют устройствам ALSA. - Вы можете определить класс
Endpoint
этого объекта по свойствуmedia.class
. - Начиная с WirePlumber v0.4.9, узлы ALSA используют имя PCM для заполнения
node.nick
, что полезно, по крайней мере, на картах HDA, использующих UCM, где все выходы (аналоговые, HDMI и т.д.) отображаются какNode
на одном профиле.
- Команда
pw-top
показывает списокDevice
иNode
, используемых в настоящее время. - Команда
wpctl inspect ID
выводит тот же самый список свойств, что и командаpw-cli dump ID
.
Изменение свойства устройства/узла
Чтобы изменить свойство устройства или узла, например, его описание или ник, создайте Lua-скрипт и добавьте его в /etc/wireplumber/
или ~/.config/wireplumber/
с соответствующими путём и именем.
Например, чтобы изменить описание узла ALSA, можно создать примерно такой файл:
/etc/wireplumber/main.lua.d/51-device-rename.lua (или ~/.config/wireplumber/main.lua.d/51-device-rename.lua)
rule = { matches = { { { "node.name", "equals", "alsa_output.pci-0000_00_1f.3.output_analog-stereo" }, }, }, apply_properties = { ["node.description"] = "Laptop", }, } table.insert(alsa_monitor.rules, rule)
А для изменения каких-нибудь свойств узла или устройства Bluetooth можно создать примерно такой файл:
/etc/wireplumber/bluetooth.lua.d/51-device-rename.lua (или ~/.config/wireplumber/bluetooth.lua.d/51-device-rename.lua)
rule = { matches = { { { "node.name", "equals", "bluez_output.02_11_45_A0_B3_27.a2dp-sink" }, }, }, apply_properties = { ["node.nick"] = "Headphones", }, } table.insert(bluez_monitor.rules, rule)
Свойства, которые вы можете изменить, а также правила сопоставления для выбора устройств или узлов описаны в документации WirePlumber: конфигурация ALSA[устаревшая ссылка 2024-01-13 ⓘ] и конфигурация Bluetooth[устаревшая ссылка 2024-01-13 ⓘ].
Отключение устройства/узла
Начиная с WirePlumber v0.4.7, пользователи могут отключать любые устройства или узлы с помощью свойства device.disabled
или node.disabled
.
/etc/wireplumber/main.lua.d/51-alsa-disable.lua (или ~/.config/wireplumber/main.lua.d/51-alsa-disable.lua)
rule = { matches = { { { "device.name", "equals", "alsa_card.pci-0000_08_00.4" }, }, }, apply_properties = { ["device.disabled"] = true, }, } table.insert(alsa_monitor.rules,rule)
Чтобы узнать имя alsa_card.*
в вашей системе, смотрите #Получение имени интерфейса для правил matches.
Одновременное использование нескольких выводов на одной звуковой карте
Создайте копию /usr/share/alsa-card-profile/mixer/profile-sets/default.conf
, чтобы изменения сохранялись при обновлениях. В нём мы определим профиль, объединяющий два стандартных отображения для аналогового и HDMI выводов.
/usr/share/alsa-card-profile/mixer/profile-sets/multiple.conf
[General] auto-profiles = no [Mapping analog-stereo] device-strings = front:%f channel-map = left,right paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic priority = 15 [Mapping hdmi-stereo] description = Digital Stereo (HDMI) device-strings = hdmi:%f paths-output = hdmi-output-0 channel-map = left,right priority = 9 direction = output [Profile multiple] description = Analog Stereo Duplex + Digital Stereo (HDMI) Output output-mappings = analog-stereo hdmi-stereo input-mappings = analog-stereo
Теперь настроим Wireplumber на использование нового профиля карты для нужных устройств. Получение идентификаторов описано в разделе #Получение имени интерфейса для правил matches. Мы применим конфигурацию, создав такой Lua-скрипт:
/etc/wireplumber/main.lua.d/51-alsa-custom.lua (или ~/.config/wireplumber/main.lua.d/51-alsa-custom.lua)
rule = { matches = { { { "device.nick", "matches", "HDA Intel PCH" }, }, }, apply_properties = { ["api.alsa.use-acp"] = true, ["api.acp.auto-profile"] = false, ["api.acp.auto-port"] = false, ["device.profile-set"] = "multiple.conf", ["device.profile"] = "multiple", }, } table.insert(alsa_monitor.rules,rule)
Советы и рекомендации
Регулировка звука клавиатурой
Привяжите следующие команды к своим кнопкам регулировки громкости: XF86AudioRaiseVolume
, XF86AudioLowerVolume
, XF86AudioMute
, XF86AudioMicMute
. Подробнее это рассмотрено здесь: Горячие клавиши#Xorg.
Для увеличения громкости:
$ wpctl set-volume @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@
[MUTED]
.Смотрите также
- Документация — Официальная документация
- WirePlumber, менеджер сеансов PipeWire — Сообщение в блоге Джорджа Киагиадакиса (Collabora) от мая 2020 года с подробным описанием работы WirePlumber