Настройка PipeWire#

Что такое PipeWire?#

PipeWire - это новая альтернатива PulseAudio, которая призвана избавить пользователей от проблем своего предшественника, уменьшить задержки звука и снизить потребление памяти, а также улучшить безопасность.

С недавних пор PipeWire поставляется в Arch Linux и ряде других дистрибутивов Linux в качестве звукового сервера по умолчанию, требуемого для клиентов libpulse [1], так что никаких команд для его установки прописывать не нужно.

Уменьшение задержки звука#

Для понижения задержек звука нужно изменить алгоритм планирования процессов PipeWire, сделав обработку звука первоочередной задачей для системы. И хотя в базовой поставке уже есть специальный модуль (libpipewire-module-rt.so), который отвечает за автоматическое повышение проритета и установление политики планирования реального времени для потоков, непосредственно обрабатывающих аудио потоки, но по умолчанию он имеет ограниченное применение в виду лимита безопасности на максимально устанавливаемое значение среди пользовательских процессов. Чтобы убрать данное ограничение, необходимо создать соответствующий конфигурационный файл:

/etc/security/limits.d/20-rt-audio.conf#
 @audio - rtprio 98

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

Настройка частоты дискретизации#

Несмотря на то, что настройки по умолчанию могут работать достаточно хорошо для большинства оборудования, имеет смысл выполнить дополнительную настройку для улучшения качества звука (особенно если вы являетесь обладателем ЦАП или полноценной звуковой карты).

Сначала создадим пути для хранения конфигурационных файлов в домашней директории:

mkdir -p ~/.config/pipewire/pipewire.conf.d

В появившейся директории создадим файл со следующим содержанием:

~/.config/pipewire/pipewire.conf.d/20-no-resampling.conf#
 context.properties = {
   default.clock.rate = 48000
   default.clock.allowed-rates = [ 44100 48000 96000 192000 ]
 }

Фактически здесь мы настраиваем две вещи: первое, это частота дискретизации, используемая по умолчанию (defalut.clock.rate), в зависимости от которой PipeWire так же считает оптимальные задержки для вывода звука, а именно так называемые значения quantum, о которых будет рассказано в следующем разделе. Во-вторых, мы явно перечисляем все доступные частоты дискретизации (defalut.clock.allowed-rates), поддерживаемые нашим устройством вывода звука (ЦАП или встроенная аудиокарта). Это нужно для того, чтобы PipeWire не делал ресемплирования, то есть изменения частоты дискретизации исходного аудиопотока к частоте используемой по умолчанию, что может повлечь за собой ухудшение качества итогового звучания, а также дополнительные накладные расходы в виде нагрузки на CPU.

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

Чтобы узнать весь диапозон частот доступных для вашего устройства, следует использовать данную команду:

cat /proc/asound/card0/codec\#0 | grep -A 8 "Audio Output" -m 1 | grep rates
cat /proc/asound/card0/stream0 | grep Rates | uniq

Частоты, которые были получены таким образом, нужно прописать через пробел взамен тех, что даны в примере выше. Если доступно несколько устройств, то при помощи команды cat /proc/asound/cards узнайте номер звуковой карты, которая используется непосредственно для вывода звука, и подставьте его в команду выше.

Микширование стерео в 5.1#

PipeWire так же как и PulseAuido позволяет микшировать звук в 5.1. Эта возможность отключена по умолчанию, но для неё существует заранее подготовленный конфигурационный файл, который нам нужно просто перенести в домашнюю директорию:

mkdir -p ~/.config/pipewire/pipewire-pulse.conf.d ~/.config/pipewire/client-rt.conf.d
cp /usr/share/pipewire/client-rt.conf.avail/20-upmix.conf ~/.config/pipewire/pipewire-pulse.conf.d
cp /usr/share/pipewire/client-rt.conf.avail/20-upmix.conf ~/.config/pipewire/client-rt.conf.d

Исправление "потрескивания" звука под нагрузкой#

Некоторые пользователи после перехода на PipeWire могут столкнуться с появлением "хрипов" или так называемого "потрескивания" во время произведения звука, если система находится под высокой нагрузкой (например, фоновой компиляцией или во время игры). Это происходит потому, что PipeWire старается осуществлять вывод с звука с наименьшими задержками, что сложно гарантировать даже тогда, когда система настроена на приоритизацию процессов по выводу звука.

Для решения данной проблемы следует создать новый конфигурационный файл с указанием измененных значений для минимального размера буфера:

~/.config/pipewire/pipewire.conf.d/10-sound.conf#
 context.properties = {
   default.clock.min-quantum = 512
   default.clock.quantum = 4096
   default.clock.max-quantum = 8192
 }

Если после этого проблема осталась, то рекомендуется умножить значение min-quantum на два и проверить снова до тех пор пока проблема не перестанет воспроизводится.

Поддержка JACK#

JACK - это ещё один альтернативный звуковой сервер с одноименной библиотекой API, цель которого состоит выведение звука с минимальной задержкой. Несмотря на неплохую поддержку JACK со стороны многих приложений, автор рекомендует по прежнему использовать звуковой сервер PipeWire, так как актуальная реализация JACK - jack2, практически не получает серьёзных улучшений и находится скорее в состоянии сопровождения.

Для правильной работы приложений использующих JACK в качестве библиотеки API лучше всего установить пакет pipewire-jack, который предоставляет совместимость между такими приложениями со звуковым сервером PipeWire, что позволяет всем изменениям проделенным выше для его настройки распространяться и на приложения, использующие JACK:

sudo pacman -S pipewire-jack