WirePlumber (Русский) - ArchWiki

Jump to content
From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи WirePlumber. Дата последней синхронизации: 11 октября 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- PipeWire (Русский)

WirePlumber — это мощный менеджер сеансов и политик для PipeWire. Основанный на модульном дизайне, с плагинами Lua, реализующими фактическую функциональность управления, он обладает высокой настраиваемостью и расширяемостью.

## Установка

Установите пакет wireplumber. Он конфликтует с пакетами других менеджеров сеансов PipeWire, что гарантирует, что они будут удалены.

WirePlumber использует пользовательский экземпляр systemd для управления сервером.

По желанию установите wireplumber-docs для просмотра документации.

## Настройка

### Расположение файлов настроек

Конфигурация WirePlumber состоит из глобальных JSON-подобных объектов, похожих на объекты из конфигурации PipeWire, таких как `context` и `alsa_monitor`. Настройки считываются из каталогов `~/.config/wireplumber/` (пользовательская конфигурация), `/etc/wireplumber/` (глобальная конфигурация) и `/usr/share/wireplumber/` (конфигурация по умолчанию).

WirePlumber начинает работу с чтения основного файла настроек. Это JSON-подобный файл, который настраивает контекст PipeWire, SPA-плагины, модули и компоненты. Среди этих компонентов есть и Lua, который используется для динамического изменения глобальных объектов.

Есть несколько разных основных файлов настроек, поставляемых вместе с пакетом:

- Настройки для одиночного экземпляра — `/usr/share/wireplumber/wireplumber.conf`. Это конфигурация по умолчанию, которая включает в себя функциональность всех других конфигураций в рамках одного процесса.
  - Смотрите документацию объекта «context», который используется во всех основных файлах настроек.
- Основной файл настроек — `/usr/share/wireplumber/main.conf`. Он загружает модули и компоненты, необходимые для ядра WirePlumber, а также загружает скрипты Lua из `каталог-настроек/main.lua.d/`. [1]
  - Смотрите документацию объектов ALSA и объектов «access».
- Файл настроек Bluetooth — `/usr/share/wireplumber/bluetooth.conf`. Он может использоваться для отдельного процесса WirePlumber, который обрабатывает подключения Bluetooth для основного процесса. При этом загружаются файлы Lua из `каталог-настроек/bluetooth.lua.d/`.
  - Смотрите документацию объекта Bluetooth.
- Файл настроек policy — `/usr/share/wireplumber/policy.conf`. В нём содержится функциональность политики, с помощью которой WirePlumber принимает решения о перемещении и внесении изменений в узлы. При этом загружаются файлы Lua из `каталог-настроек/policy.lua.d/`
  - Смотрите документацию объектов, связанных с политиками.

Lua-скрипты из каталогов `lua.d/` также загружают другие Lua-скрипты из `каталог-настроек/scripts/`. Эти скрипты реализуют некоторые логические/функциональные возможности Pipewire и могут быть полезны при определённых обстоятельствах.

### Изменение настроек

Рекомендуемый способ для настройки WirePlumber — добавить Lua-скрипт в соответствующий каталог `lua.d/` в `/etc/wireplumber/` или `~/.config/wireplumber/`. Следует учесть следующие моменты:

- Если вы хотите создать скрипт, который полностью заменит собой стандартный скрипт, скопируйте его из `/usr/share/wireplumber/` в место назначения с тем же самым именем. Будет прочитан только самый приоритетный файл; файлы с таким же именем из менее приоритетных каталогов будут проигнорированы. [2]
- В противном случае, если вы хотите добавить новый скрипт, в начале его имени укажите номер больше 50 (например, `51-my-config.lua`), так как настройки по умолчанию в основном содержатся на уровне 50 или ниже.
  - Имейте в виду, что WirePlumber выполняет multi-path merging, а это значит, что стандартные настройки с более низким номером будут прочитаны раньше вашего нового скрипта, так как файлы настроек сортируются по их именам.
- Выбранный вами каталог должен соответствовать тому, что делает конфигурация по умолчанию, но это не имеет особого значения, если вы не используете несколько экземпляров.
- Свойства 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 и конфигурация Bluetooth.

### Отключение устройства/узла

Начиная с 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.

Примечание: Обычным случаем использования, например, является отключение HDMI аудиовыхода NVIDIA.

### Одновременное использование нескольких выводов на одной звуковой карте

Создайте копию `/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

Category:

- Multimedia (Русский)