Восстановление громкости с помощью PipeWire/WirePlumber

Вопрос или проблема

С использованием чистого ALSA есть alsa-restore.service, который восстанавливает состояние звуковой карты после перезагрузки системы (громкость, выключатели звука и т.д.).

Меня интересует, как достичь того же эффекта с PipeWire/WirePlumber. По некоторой причине после перезагрузки мой выход для наушников заглушен, и некоторые другие настройки сбрасываются на значения по умолчанию.

alsa-restore.service не работает, так как PipeWire/WirePlumber перезаписывает настройки при запуске.

Конфигурация Lua для WirePlumber очень сложная, и я не могу ее понять. Я прошу помощи.

Обычно, на Linux системах с графическим интерфейсом пользователя, первая программа, которая появляется, это приветствие, которое отображает экран входа. Это приветствие выполняется в пользовательском контексте systemd, который запускает пользовательские юниты (сервисы), определенные для всех пользователей. Одним из этих юнитов является Pipewire, который запускает WirePlumber.

Когда WirePlumber запускается, первым делом по умолчанию он восстанавливает ранее сохраненные маршруты, которые хранятся для каждого пользователя и включают настройку громкости. Если это не удается, WirePlumber устанавливает громкость по умолчанию на 40% для выходов и 100% для источников.

Поэтому, если ваше приветствие не поддерживает WirePlumber, оно может сбросить громкость каждый раз, когда появляется экран входа, что является изменением, захватываемым экземпляром WirePlumber для фактических пользователей при входе, перезаписывая любые ранее сохраненные громкости.

Трудно сказать без дополнительной информации об окружении, влияет ли эта конкретная проблема на вас, но это кажется распространенной проблемой, которую достаточно трудно устранить, так что я думаю, это стоит того, чтобы изучить. В моем случае это произошло с LightDM. Вики Debian имеет раздел, посвященный этой проблеме с PipeWire и SDDM.

Поскольку приветствию обычно не требуется воспроизводить звук, мое предпочтительное решение – отключить PipeWire полностью для учетной записи пользователя приветствия. Для этого выполните следующие команды в терминале:

  1. Войдите в систему в сеансе systemd для пользователя приветствия: sudo machinectl shell lightdm@ /bin/sh. Замените lightdm на пользователя, от имени которого работает ваше приветствие. Если команда machinectl недоступна, убедитесь, что установлен пакет, который ее предоставляет, systemd-container на Debian.
  2. Остановите PipeWire и WirePlumber: systemctl --user stop pipewire.service pipewire.socket wireplumber.service wireplumber.socket
  3. Отключите PipeWire и WirePlumber: systemctl --user disable pipewire.service pipewire.socket wireplumber.service wireplumber.socket
  4. В качестве дополнительной безопасности заблокируйте PipeWire и WirePlumber: systemctl --user mask pipewire.service pipewire.socket wireplumber.service wireplumber.socket
  5. Если все прошло хорошо, systemctl --user status wireplumber.service должен сообщить, что юнит WirePlumber не активен и заблокирован, и он не должен запускаться снова, даже если вы повторите шаг 1. С этого момента только фактические входы в систему будут приводить к запуску WirePlumber.

Я решил эту проблему на Kubuntu 24.10 без использования machinectl

sudo systemctl --user --machine sddm@ stop pipewire.service pipewire.socket wireplumber.service 
sudo systemctl --user --machine sddm@ disable pipewire.service pipewire.socket wireplumber.service 
sudo systemctl --user --machine sddm@ mask pipewire.service pipewire.socket wireplumber.service 

Мое приветствие работает как sddm.

Ответ или решение

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

Теория

PipeWire — это мультиплатформенное и многофункциональное мультимедийное решение для Linux, которое заменяет или дополняет функции ALSA и PulseAudio. WirePlumber — это менеджер сессий для PipeWire, который отвечает за управление аудиопотоками и устройствами. В отличие от ALSA, где службы типа alsa-restore.service смогут легко восстанавливать состояние звуковых карт, WirePlumber предполагает использование более сложных механизмов конфигурации, которые хранят и управляют состоянием мультимедиа-потоков.

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

Пример

Настройки startup-скриптов и сервисов в Linux могут отличаться в зависимости от используемой дисплейной среды и дисплейного менеджера (greeter). Рассмотрим конкретный пример: если ваш greeter не поддерживает WirePlumber, это может привести к сбросу пользовательских настроек громкости всякий раз при загрузке экрана входа. Это объясняется тем, что greeter может запускать собственные процессы PipeWire и WirePlumber, которые инициализируют настройки устройств перед тем, как пользователь войдет в систему.

На практике это может выглядеть так: при использовании LightDM звук может быть сброшен на 40% для выводов (sinks) и 100% для источников (sources), что мешает сохранению пользовательских настроек.

Применение

Чтобы решить эту проблему, можно воспользоваться следующим подходом, который предлагает отключение PipeWire и WirePlumber для учетной записи greeter. Это обеспечит, что сервисы PipeWire будут запускаться только для реальных пользователей, а не для greeter, минимизируя вмешательство в пользовательские настройки звука.

  1. Определение пользователя greeter: Это может быть lightdm, gdm, sddm или другой пользователь, в зависимости от вашего дисплейного менеджера.

  2. Отключение сервисов PipeWire для greeter:

    • Вход в сессию systemd для greeter: используйте machinectl или другую соответствующую утилиту, если machinectl отсутствует.

      sudo machinectl shell lightdm@ /bin/sh

      Здесь lightdm замените на пользователя вашего greeter.

    • Остановка и отключение сервисов:

      systemctl --user stop pipewire.service pipewire.socket wireplumber.service wireplumber.socket
      systemctl --user disable pipewire.service pipewire.socket wireplumber.service wireplumber.socket
    • Маскирование сервисов для предотвращения их автоматического запуска:

      systemctl --user mask pipewire.service pipewire.socket wireplumber.service wireplumber.socket
  3. Проверка статуса:
    Убедитесь, что WirePlumber больше не активен для greeter:

    systemctl --user status wireplumber.service
  4. Подтверждение изменений:
    Теперь, при следующих запусках системы, WirePlumber и PipeWire будут запускаться только после входа пользователя в систему, что предотвратит сброс пользовательских настроек звука greeter.

Эта стратегия не только эффективна для сохранения индивидуальных настроек звука пользователей, но также минимизирует потенциальные конфликты с настройками, которые могут производиться при использовании greeter. Важно следить за обновлениями в документации по PipeWire и WirePlumber, так как это решением может изменяться с новыми релизами программного обеспечения и способов управления мультимедийными сессиями.

Оцените материал
Добавить комментарий

Капча загружается...