Состоялся переход Calculate Linux на звуковой (и не только) сервер pipewire. По этому поводу я решил поделиться некоторыми тонкостями, хитростями и советами по расширенной настройке.
Прежде чем начать, я хочу успокоить тех, кто недостаточно хорошо понимает как переход отразится на использующих pulseaudio программах. Новый звуковой сервер написан и сконфигурирован так чтобы прозрачно заменить собой сервер pulseaudio, соответственно все программы будут работать с ним так же как и раньше, в идеале вы вообще не должны заметить каких либо изменений в их работе. Переход на pipewire не означает удаление из системы pulseaudio, его библиотеки по прежнему необходимы для нормальной работы большинства издающих звуки программ, поменялся только сам звуковой сервер.
Работавшие с pulseaudio микшеры pavucontrol, kmix и другие по прежнему пригодны для настройки громкости и перенаправления потоков.
Pipewire так же умеет притворяться сервером jack, в этом случае потребуется дополнительная конфигурация и включение дополнительных use флагов. Подобная настройка выходит за рамки этой статьи, так как я не занимаюсь профессиональной работой со звуком и не использую jack.
ВНИМАНИЕ, ЭТО ВАЖНО
В статье приводятся примеры редактирования конфигурационных файлов. Не нужно редактировать, удалять или как либо трогать конфигурационные файлы в /usr/share/pipewire
и /usr/share/wireplumber
. Все настройки делаются в /etc/pipewire
и /etc/wireplumber
соответственно. По умолчанию эти директории отсутствуют, их нужно создать и разместить в них копии нужных вам конфигов с сохранением структуры директорий. После любых манипуляций с конфигами нужно перезайти в графический сеанс, тем самым перезапустив pipewire.
В pipewire-0.3.40-r1
изменился способ запуска звукового сервера, управлением сессиями отныне занимается новый сервер wireplumber
, в связи с этим в статью были внесены изменения. Если вы читали эту статью раньше и вносили изменения в конфигурацию - вам придётся внимательно перечитать статью и исправить конфиги.
Описание процесса запуска pipewire
При запуске графической среды из /etc/xdg/autostart/pipewire.desktop
исполняется скрипт-обёртка /usr/bin/gentoo-pipewire-launcher
, который и запускает серверы pipewire
и wireplumber
. Как именно он это делает можно прочитать в теле этого скрипта. Не стоит редактировать этот скрипт, так как все внесённые в него изменения будут перезаписаны при обновлении. Вся настройка осуществляется через файлы конфигурации.
Ранее pipewire
запускался из файла /etc/xdg/autostart/pipewire.desktop
напрямую, читал свой файл конфигурации pipewire.conf
, и запускал себя с нужными параметрами и pipewire-media-session
согласно секции конфига context.exec
.
Если у вас существует конфиг /etc/pipewire/pipewire.conf
в нём необходимо закомментировать строки:
...
{ path = "/usr/bin/pipewire" args = "-c pipewire-pulse.conf" }
...
{ path = “/usr/bin/pipewire-media-session” args = “” }
...
так как в них больше нет необходимости, сервер нынче стартует из скрипта /usr/bin/gentoo-pipewire-launcher
сразу с нужными параметрами и в этих строчках не нуждается, кроме того pipewire-media-session больше нет, его функцию выполняет стартующий из этого же скрипта wireplumber
. Если вы читали эту статью ранее и настраивали virtual surround – перечитайте фрагмент с его настройкой, отныне я запускаю его из конфига pipewire-pulse.conf
, так что pipewire.conf
можно смело удалить вообще.
Вылетает kmix, не происходит автостарт kmix
Такое может происходить если kmix
стартует раньше чем pipewire
и wireplumber
, а так же если kmix “запомнил” какую то неправильную конфигурацию с предыдущего запуска и пытается её восстановить.
Если у вас присутствует конфиг /etc/pipewire/pipewire.conf
– удалите его совсем, или закомментируйте в нём всё в секции context.exec
, так как старый конфиг может мешать правильному запуску. Если вы до этого настраивали virtual surround по старой редакции этой статьи – перечитайте фрагмент с настройкой, virtual surround теперь запускается из конфига pipewire-pulse.conf
, pipewire.conf
для этого больше не требуется и может быть удалён. Не нужно исправлять pipewire.conf и настраивать запуск wireplumber оттуда, он должен стартовать из скрипта-обёртки, так как в скрипте это реализовано правильным образом, с задержкой.
Настройки kmix хранятся в ~/.config/kmixctrlrc
и ~/.config/kmixrc
, после их удаления kmix нужно будет настроить заново. Если всё это не помогло, и kmix по прежнему не стартует при включённом в его настройках автозапуске, попробуйте вместо него использовать плазмоид kmix. Да, есть и такое, вытащите его виджет на панель и пользуйтесь им. Функционал у него точно такой же. Многим он даже больше нравится чем отдельное приложение.
Работа с внешними usb картами, проводными наушниками, микрофонами, гарнитурами, колонками и т.п.
Настройкой цепочек, определением входов и всем таким прочим отныне занимается wireplumber
. Его конфигурация по умолчанию находится в /usr/share/wireplumber
, отредактированные под себя конфиги следует держать в /etc/wireplumber
. Автоматически сгенерированные настройки, значения громкости и перенаправления каналов хранятся в директории ~/.local/state/wireplumber/
Если у вас есть директория /etc/pipewire/media-session.d/
смело удаляйте её вместе со всем содержимым, так как она содержит конфиги уже не существующего pipewire-media-session
.
Для определения типа подключаемых устройств wireplumber
опирается на alsa acp
(alsa card profile). Так что если у вас не появился микрофон или неправильно определяются входы-выходы – виновата alsa
– неправильно определяет профиль вашей звуковой карты, и настраивать нужно её, а не wireplumber
, ему просто неоткуда брать информацию кроме alsa
.
Можно попробовать отключить использование этого механизма. Для этого нужно скопировать конфиг /usr/share/wireplumber/main.lua.d/alsa-config.lua
в /etc/wireplumber/main.lua.d/alsa-config.lua
и изменить строку
["api.alsa.use-acp"] = true,
на
["api.alsa.use-acp"] = false,
Дополнительно можно заставить wireplumber использовать механизм ucm (Use Case Manager), удалив комментарий (--
) со строки
--["api.alsa.use-ucm"] = true,
Посмотреть какие микрофоны доступны можно командой в консоли (от юзера)
$ pw-record --list-targets
Полезные советы
Существуют две дополнительные настройки, которые понравятся тем, кто постоянно использует наушники. Скопируйте конфиг /usr/share/pipewire/pipewire-pulse.conf
в /etc/pipewire/
и в нём раскоментируйте строки channelmix.normalize
, channelmix.mix-lfe
и исправьте false
на true
.
channelmix.normalize = true
channelmix.mix-lfe = true
Первая опция выравнивает громкости звучания разных источников, позволяя избегать внезапных ударов музыкой по ушам, вторая добавляет к обычным каналам низкочастотный канал сабвуфера, если он присутствует в аудиопотоке. Профессиональные звукоинженеры так делать не рекомендуют, общепринятой рекомендацией является отбрасывать канал сабвуфера если его нет физически в комплекте акустики, чтобы избежать низкочастотного дребезга и резонансов, однако при использовании наушников эта настройка даёт более насыщенный басами звук при просмотре фильмов. Хорошо сочетается с фильтром virtual surround, настройка которого описана во второй части статьи.
Что делать если падают использующие старую библиотеку libSDL программы
Библиотека libsdl2 недавно научилась использовать pipewire в качестве аудиодрайвера, о чём наглядно свидетельствует появившийся у пакета use флаг pipewire
, так что мы можем рассказать использующим SDL программам (например запускающимся через steam proton играм), что они могут играть сразу в pipewire напрямую. Для этого служит переменная SDL_AUDIODRIVER=pipewire
, которая в Calculate Linux объявлена глобально. Часть игр и старых программ используют библиотеку SDL1.2, которая не знает о существовании pipewire, кроме того, некоторые программы и игры могут быть статически слинкованы со старыми версиями SDL. В этом случае инициализация звуковой подсистемы закончится крахом, так как в переменной SDL_AUDIODRIVER
будет неизвестный для них драйвер. Перечисление драйверов через запятую SDL_AUDIODRIVER=pipewire,pulseaudio,alsa
так же не помогает, так как в старых библиотеках SDL1.2, которые игра или старая программа может “носить с собой” не поддерживается перечисление драйверов через запятую.
Исправить это достаточно просто, нужно любым доступным вам способом, через запускающий игру скрипт, через свойства её “значка”, передать этой программе (и только ей) переменную SDL_AUDIODRIVER=pulseaudio.
Я не рекомендую объявлять SDL_AUDIODRIVER=pulseaudio глобально. Так как эта переменная заставит абсолютно все использующее библиотеку libSDL2 программы использовать эмуляцию pulseaudio вместо работы с pipewire напрямую.
Прочие полезные вещи
Рекомендую обратить внимание на консольную команду pw-top
, это монитор источников и приёмников звука в системе, можно наглядно посмотреть что взаимодействует с сервером pipewire, на какой частоте дискретизации и с каким размером буфера.
Продвинутая настройка
В качестве примера я покажу конфигурирование фильтра virtual surround, использующего метод HRTF на основе физических измерений модели человеческой головы kemar и позволяющего получать эффект пятиканального звучания с позиционированием источников звука в любых стереонаушниках.
Вы сможете направить в этот фильтр звук из видоплейера при просмотре фильма с многоканальными аудиодорожками, или игру умеющую выводить многоканальный звук, почувствуете аудиопанораму, или сможете услышать откуда к вам приближается противник, спереди или сзади, не покупая “геймерские” многоканальные наушники и не отчисляя никому денег за использование патентов (в Windows 10 галочка включающая аналогичный фильтр платная).
Существует фильтр и для семиканального звучания, с возможностью использования наработок проекта HeSuVi, но мне для игр достаточно пяти каналов. Однако вы можете реализовать его самостоятельно по аналогии с описанным тут методом, воспользовавшись ссылками в конце статьи.
Итак, первым делом скопируем нужные нам файлы в /etc/pipewire
.
# mkdir /etc/piprwire /etc/pipewire/filter-chain /etc/pipewire/hrir_kemar
# cp /usr/share/pipewire/pipewire-pulse.conf /etc/pipewire/
# cp /usr/share/pipewire/filter-chain/sink-virtual-surround-5.1-kemar.conf /etc/pipewire/filter-chain/
Теперь вам нужно скачать (firefox может ругаться на сертификат, не обращайте внимания, учёные забыли включить в сертификат поддомен stuff), распаковать и положить в директорию /etc/pipewire/hrir_kemar/ файл hrir-kemar.wav с шаблонами семплов, полученными в результате измерений “пластиковой головы”. Не забудьте сделать пользователя root его владельцем, просто ради порядка. Слушать его не нужно, это не звуковой файл, хотя и имеет расширение wav.
Теперь нужно отредактировать конфиг /etc/pipewire/filter-chain/sink-virtual-surround-5.1-kemar.conf
, заменив во всех строках hrir_kemar/hrir-kemar.wav
на /etc/pipewire/hrir_kemar/hrir-kemar.wav
Почти всё, осталось сделать так чтобы этот фильтр загружался автоматически. Редактируем /etc/pipewire/pipewire-pulse.conf
, добавив в cекцию context.exec
сразу после строки
...
#{ path = "/usr/bin/sh" args = "~/.config/pipewire/default.pw" }
строку
{ path = "/usr/bin/pipewire" args = "-c filter-chain/sink-virtual-surround-5.1-kemar.conf" }
не забудьте убедиться в наличии закрывающей ]
в конце файла.
Всё, теперь можно перезайти в графический сеанс и убедиться что в kmix появился новый ползунок “неизвестное приложение: virtual surround sink”. Для перенаправления звука в этот фильтр нужно кликнуть правой клавишей мыши на ползунке громкости выдающей пятиканальный звук программы или игры и выбрать в выпадающем меню “использовать устройство” “virtual surround sink”.
Благодарю за внимание.
Ссылки послужившие основой для написания статьи:
https://wiki.gentoo.org/wiki/PipeWire
https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Filter-Chain
https://wiki.archlinux.org/title/PipeWire