Pipewire, полезные советы и расширенная настройка - новая редакция

Состоялся переход 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

Документация pipewire
Pipewire wiki

5 Likes

Как быть, если после обновления и перехода с pulseaudio на pipewire, вообще все перестало работать и вынимание и втыкание наушников и микрофона не помогает ?

лично у меня стало еще хуже == пульса совсем пропало, остались только альса и пипевире.

На звук не жалуюсь, но значок Kmix ведёт себя странно - на ноуте не стартует в принципе (только руками), на стационарнике нормально. Один раз только не запустился. Конфиги /etc/pulse /etc/pipewire сравнивал, на обоих компах одинаковы. В чём может быть проблема, может знает кто?

Проверьте /etc/xdg/autostart/kmix_autostart.desktop, там должно быть X-KDE-autostart-after=panel;pipewire, ну и в настройках kmix убедитесь что автостарт включен. И в /etc/xdg/autostart/restore_kmix_volumes.desktop должно быть X-KDE-autostart-after=pipewire. Снесите в /home/{ваш_юзер}/.config/ старые настройки kmix, все три файла, может он при попытке восстановить параметры падает. Ессно после сноса настроек kmix нужно будет перезапустить и заново в его настройках галочки развесить. Ну и кроме отдельной программы kmix, которая в трей прячется, есть ещё и plasma applet kmix, можете попробовать его в панель вытащить, а автозапуск kmix отключить тогда в его настройках.

/etc/xdg/autostart/ тоже проверял. Там всё есть. Спасибо за совет, остановился на апплете. Удаление конфигов kmix’а ничего не дало. Просто странно - на двух компах одна система, одни настройки, а результат разный. Мистика)

Мистика в том что и железо тоже может быть разным. Одни настройки конфига для всех работают одинаково, другие настройки (по названию - те-же) для разных звуковух (чипов-транзисторов) будут разными по результату (по слуху). Даже для одного производителя кол-во драйверов на разные версии чипов уже (+/-) около пятерни. А демоны, работающие поверх ядерной АЛЬСЫ - в теории должны быть первыми - НО на практике - кто-то за кем-то не успевает. Дайте им время.

Только установил систему KDE. Звука “из коробки не было” ни на мониторе через Hdmi, ни в наушниках. На других системах обычно pavucontrol выставлял откуда воспроизведение звука.
По итогу нашёл где находится, оказалось даже проще: в параметрах системы/ звуковые устройства

image

Не очень подходит данный способ переключения канала. У простой учётной записи пока не удаётся подключить наушники

image

В итоге поставил pavucontrol и переключился на аналоговый в наушниках.

Странно, но понять не могу что произошло…
стояло 12 ядро, поставил 17(зен) с лто оптимизацией, Аби (64), алса всё видит всё есть, но вот в кедах звука нет, помогает только смена выхода на пайпвайр. Какие могут быть варианты решения проблемы.
Конф пайпы подкрутил, звук ка-бы норм но наблюдается иногда выпадение сервера и виснет всё что связано со звуком. На алсе такого не было.

aplay --list-devices
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: Generic Analog [Generic Analog]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: Generic Digital [Generic Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: NVidia [HDA NVidia], device 3: Generic Digital [Generic Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0

ls -l /dev/snd
итого 0
drwxr-xr-x 2 root root 80 тра 12 16:54 by-path
crw-rw---- 1 root audio 116, 10 тра 12 16:54 controlC0
crw-rw---- 1 root audio 116, 4 тра 12 16:54 controlC1
crw-rw---- 1 root audio 116, 9 тра 12 16:54 hwC0D0
crw-rw---- 1 root audio 116, 3 тра 12 16:54 hwC1D0
crw-rw---- 1 root audio 116, 6 тра 12 16:55 pcmC0D0c
crw-rw---- 1 root audio 116, 5 тра 12 16:56 pcmC0D0p
crw-rw---- 1 root audio 116, 7 тра 12 16:55 pcmC0D1p
crw-rw---- 1 root audio 116, 8 тра 12 16:55 pcmC0D2c
crw-rw---- 1 root audio 116, 2 тра 12 16:55 pcmC1D3p
crw-rw---- 1 root audio 116, 33 тра 12 16:54 timer

aplay -L | grep :CARD
sysdefault:CARD=PCH
front:CARD=PCH,DEV=0
surround21:CARD=PCH,DEV=0
surround40:CARD=PCH,DEV=0
surround41:CARD=PCH,DEV=0
surround50:CARD=PCH,DEV=0
surround51:CARD=PCH,DEV=0
surround71:CARD=PCH,DEV=0
iec958:CARD=PCH,DEV=0
usbstream:CARD=PCH
hdmi:CARD=NVidia,DEV=0
usbstream:CARD=NVidia