Calculate Forum

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

Состоялся переход Calculate Linux на звуковой (и не только) сервер pipewire. По этому поводу я решил поделиться некоторыми тонкостями, хитростями и советами по расширенной настройке.

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

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

ВНИМАНИЕ, ЭТО ВАЖНО
В статье приводятся примеры редактирования конфигурационных файлов. Не нужно редактировать, удалять или как либо трогать конфигурационные файлы в /usr/share/pipewire. Все настройки делаются в /etc/pipewire. По умолчанию эта директория отсутствует, её нужно создать и разместить в ней копию нужного конфига из /usr/share/pipewire с сохранением структуры директорий. После любых манипуляций с конфигами нужно перезайти в графический сеанс, тем самым перезапустив pipewire.

Работа с внешними usb картами, проводными наушниками, микрофонами, гарнитурами, колонками и т.п.

Обнаружил, что когда pipewire запускается самый первый раз на машине с уже воткнутыми микрофонами, наушниками, подключеными usb гарнитурами и прочим - он не создаёт для них профили в ~/.local/state/pipewire/media-session.d/, так как не получил сигнала об их подключении (потому что они УЖЕ подключены, до того как сервер загрузился). Поэтому нужно обязательно переподключить все внешние устройства, микрофоны, гарнитуры, наушники, все. Вынуть их и вставить. После этого pipewire получит сигнал об их присутствии и нормально всё пропишет и настроит.

Дальше всё уже будет происходить само, он их будет забывать при выдёргивании, и вспоминать и перенаправлять туда звук при подключении. Если будет нужно сбросить его динамическую конфигурацию, или посмотреть что он запомнил и как настроил - это всё хранится в ~/.local/state/pipewire/media-session.d/. Всё внутреннее и неотключаемое (динамики ноута, встроенные микрофоны…) неплохо бы настроить в pavucontrol и сделать их устройствами “по умолчанию” перед подключением внешних устройств.

Для определения типа подключаемых устройств pipewire опирается на alsa acp (alsa card profile). Так что если у вас даже после всех вышеописанных манипуляций не появился микрофон - значит alsa неправильно определяет профиль вашей звуковой карты. Можно попробовать отключить использование этого механизма сервером pipewire. Для этого нужно скопировать конфиг /usr/share/pipewire/media-session.d/alsa-monitor.conf, /usr/share/pipewire/media-session.d/with-pulseaudio в /etc/pipewire/media-session.d/, в alsa-monitor.conf изменить строку

api.alsa.use-acp = true

на

api.alsa.use-acp = false

Дополнительно вместо переключения профилей можно заставить pipewire использовать механизм ucm (Use Case Manager), удалив комментарий (#) со строки

#api.alsa.use-ucm = true

Посмотреть какие микрофоны доступны можно командой в консоли (от юзера)

$ pw-record --list-targets

Bluetooth

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

Автопереключение гарнитуры между режимами наушники и наушники+микрофон (A2DP и HFP) включается в bluez-monitor.conf. Скопируйте /usr/share/pipewire/media-session.d/bluez-monitor.conf, /usr/share/pipewire/media-session.d/with-pulseaudio в /etc/pipewire/media-session.d/ и в bluez-monitor.conf раскоментируйте и исправьте строку

#bluez5.autoswitch-profile = role

на

bluez5.autoswitch-profile = true

Полезные советы

Существуют две дополнительные настройки, которые понравятся тем, кто постоянно использует наушники. Скопируйте конфиг /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.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.conf, добавив сразу после строки

{ path = "/usr/bin/pipewire" args = "-c pipewire-pulse.conf" }

строку

{ 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

3 Likes
© 2007-2020 Calculate Ltd.
Mastodon Mastodon