PipeWire пришёл на место PulseAudio и JACK, но его сильная сторона — не «ещё один звуковой сервер», а граф соединений: любые источники и приёмники соединяются ссылками, а маршрутизация описывается явно и проверяемо. Разберём, как смотреть этот граф, перенаправлять потоки, создавать виртуальные устройства для записывающих программ и снижать задержку до уровня мониторинга.
Смотрим на граф
Понимание начинается с наблюдения. В PipeWire есть набор консольных утилит, каждая отвечает за свой уровень.
wpctl status
pw-top
pw-dump | jq '.[] | select(.type=="PipeWire:Interface:Node")' | head
systemctl --user status pipewire pipewire-pulse wireplumber
Числа из wpctl status — это идентификаторы узлов, которыми мы будем оперировать: умолчательный выход меняется одной командой wpctl set-default 45. Потоки приложений — браузера, плеера, игр — отображаются отдельным списком, и каждому можно назначить свой выход. Утилита pw-top незаменима при диагностике: в ней видны формат (частота и число каналов), размер кванта и счётчик XRUN — переполнений буфера, из-за которых слышны щелчки и пропуски.
Маршрутизация потоков
Самый частый сценарий — направить звук конкретного приложения не в умолчательный динамик, а в наушники либо в отдельный выход для стрима. Есть три уровня, от простого к точному.
# 1. сменить умолчательный выход
wpctl status
wpctl set-default 42
# 2. переключить поток приложения
pactl list short sink-inputs
pactl move-sink-input 73 alsa_output.pci-0000_00_1f.3.analog-stereo
# 3. связать порты напрямую
pw-link -l | head -20
pw-link "Firefox:output_FL" "USB_Audio:playback_FL"
Команда pw-link -i открывает интерактивный режим, где связи задаются выбором строк — удобно, когда не помнишь точные имена портов. Для разводки мышью есть qpwgraph: он рисует тот же граф и хорошо показывает типичную ошибку, когда приложение упрямо держит ссылку на старый выход после переключения колонок. Обратите внимание: связи приложений и системный выход независимы, поэтому «нет звука» после смены устройства чаще означает не поломку, а оставшуюся старую ссылку.
Виртуальные устройства
Виртуальный выход (null-sink) — устройство без реального оборудования: в него складывается звук приложений, а его монитор подключается к реальным колонкам. Так OBS или Audacity получают отдельную дорожку, не зависящую от того, что слушает пользователь.
# /etc/pipewire/pipewire.conf.d/50-virtual-sink.conf
context.objects = [
{ factory = adapter
args = {
factory.name = support.null-audio-sink
node.name = "Virtual_Sink"
node.description = "Virtual Output"
media.class = Audio/Sink
audio.position = [ FL FR ]
}
}
]
sudo systemctl --user restart pipewire pipewire-pulse
wpctl status
Файл кладётся в /etc/pipewire/pipewire.conf.d/: фрагменты конфигурации подключаются автоматически и переживают обновление пакетов. После перезапуска устройство появится в дереве, а его монитор — в списке источников для записи. Чтобы звук из виртуального устройства всё-таки доходил до колонок, соедините их модулем loopback или простой ссылкой из pw-link. Монитор самого по себе задержки не добавляет — она появляется только вместе с loopback.
Связка «виртуальное устройство → реальные колонки» описывается модулем loopback: приложение пишет в Virtual_Sink, модуль забирает монитор и воспроизводит его на аппаратный выход, а дублирующая дорожка остаётся доступной для записи.
# /etc/pipewire/pipewire.conf.d/51-loopback.conf
context.modules = [
{ name = libpipewire-module-loopback
args = {
audio.sink = { node.name = "alsa_output.usb-Device.playback" }
audio.source = { node.name = "Virtual_Sink.monitor" }
}
}
]
systemctl --user restart pipewire
pw-top
Порядок проверки прост: поднимите конфиг, убедитесь в wpctl status, что оба узла видны, затем запустите запись в приложении и посмотрите в pw-top, течёт ли поток. Если молчит именно loopback — ищите его в списке узлов: чаще всего не совпали имена, и подставляйте точное node.name из вывода pw-dump.
Низкая задержка
Задержка считается по формуле «квант ÷ частота». Значение по умолчанию — 1024 семпла при 48000 Гц, то есть около 21 мс. Для мониторинга голоса через наушники этого уже слышно, поэтому квант уменьшают.
# /etc/pipewire/pipewire.conf.d/50-lowlatency.conf
context.properties = {
default.clock.rate = 48000
default.clock.quantum = 256
default.clock.min-quantum = 32
default.clock.max-quantum = 1024
}
systemctl --user restart pipewire
pw-top
256 семплов при 48 кГц — это 5,3 мс на сторону. Параметр min-quantum не даёт драйверу уйти в крошечные кванты, на которых приложение не успевает отработать и сыплет XRUN. Если щелчки появились, поднимите квант до 512: стабильность важнее цифры в бенчмарке. Проверять результат удобно той же pw-top — колонка QUANT показывает фактический размер.
Второй уровень — приоритеты. PipeWire запрашивает у планировщика реальное время, и без разрешения процесс его не получит.
ulimit -r
grep -R rtprio /etc/security/limits.conf /etc/security/limits.d/
# /etc/security/limits.d/95-realtime-users.conf
audio - rtprio 99
audio - memlock unlimited
Пользователь должен состоять в группе audio, а после правки файла лимитов нужно перелогиниться — настройка подхватывается только новой сессией. Убедиться, что всё сработало, можно по отсутствию сообщений «could not acquire real-time priority» в журнале.
Диагностика типичных проблем
- Звук пропал после обновления. Смотрим журнал:
journalctl --user -u pipewire -u wireplumber --since -10min. Частая причина — конфликт с оставшимся PulseAudio: проверьтеpactl info | grep "Server Name", в выводе должен стоять PipeWire. - Устройства не появились в графе. Проверьте ALSA напрямую:
aplay -l. Если карта видна, но её нет вwpctl status, перезапустите wireplumber; если список пуст и там — проблема на уровне драйвера. - Выбирается не тот выход. Настройки автовыборки HDMI живут в конфигах
/etc/wireplumber/wireplumber.conf.d/, где правила сопоставления задаются для конкретных устройств. - Приложение не видит звук. Убедитесь, что установлен
pipewire-pulse— без него программы, ищущие сервер PulseAudio, работать не будут. - Bluetooth-гарнитура работает как колонки. Профиль A2DP не имеет канала микрофона: переключите карточку на
headset-head-unitчерезpactl set-card-profile.
Итог
PipeWire устроен прозрачно: узлы, порты и ссылки, которые всегда можно посмотреть через wpctl, pw-top и pw-link. Маршрутизация сводится к смене умолчательного выхода, переносу потока или жёсткой связке портов; виртуальные устройства описываются конфигом в pipewire.conf.d и не требуют отдельных пакетов; низкая задержка достигается уменьшением кванта и выдачей приоритетов планировщика. Начинайте диагностику всегда с графа и журнала — в большинстве случаев звук «пропадает» не из-за поломки, а из-за неверной ссылки.