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 и не требуют отдельных пакетов; низкая задержка достигается уменьшением кванта и выдачей приоритетов планировщика. Начинайте диагностику всегда с графа и журнала — в большинстве случаев звук «пропадает» не из-за поломки, а из-за неверной ссылки.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте