Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

NVIDIA и PipeWire: HDMI-звук через видеокарту

Видеокарта NVIDIA умеет отдавать звук по HDMI не хуже встроенной звуковой карты: в ней есть собственный аудиоконтроллер, и система видит его как обычное HDA-устройство. Проблема начинается, когда карта есть, а в PipeWire нет ни одного HDMI-sink, или он есть, но звук уходит в колонки ноутбука. Разбираемся, где искать устройство, как задать профиль и что делать, если звук исчезает после сна.

Как устроен HDMI-звук на видеокарте

Внутри любой дискретной карты, включая NVIDIA, есть аудиоконтроллер High Definition Audio. Он умеет только одно: передавать цифровой поток по HDMI или DisplayPort на кодек телевизора или монитора, который уже превращает его в аналоговый звук. Никаких колонок и микрофонов на карте нет, поэтому в системе появляется ровно один выход типа «цифровой стерео», а в списке устройств — строчка с именем самой видеокарты.

Дальше цепочка выглядит так: аудиоконтроллер карты → модуль ядра snd_hda_intel с HDMI-кодеком snd_hda_codec_hdmi → ALSA → PipeWire → профиль устройства в WirePlumber. Сломанное звено может быть в любом месте, поэтому диагностика идёт снизу вверх.

Как проверить, что видеокарта вообще отдаёт звук

Первый вопрос: видит ли система аудиоконтроллер карты. Смотрится это так:

lspci | grep -iE "audio controller|multimedia"
cat /proc/asound/cards
aplay -l

В выводе должны быть две карты: встроенная HDA Intel и отдельная NVIDIA. Если аудиоконтроллер есть в PCI, но карты в /proc/asound/cards нет, проблема в ядре — проверь модули и параметры:

lsmod | grep -E "snd_hda_intel|snd_hda_codec_hdmi"
dmesg | grep -iE "snd_hda|hdmi" | tail -20

Второй вопрос: создал ли PipeWire устройство. Список в реальном времени:

wpctl status
wpctl list-sinks

Здесь стоит знать особенность именования: HDMI-выход часто называется alsa_output.pci-0000_01_00.1.analog-stereo, то есть с удивлением слово «analog», хотя поток цифровой. Это историческое имя в ALSA, пугаться не нужно. Если вместо списка видно Sinks: no sinks found, проверь, что сервисы вообще запущены:

systemctl --user status pipewire pipewire-pulse wireplumber

Почему устройство есть, а звука нет?

Самые частые причины, по возрастанию частоты:

  • Sink в статуме idle или недоступен. Пока к HDMI не подключён монитор с аудио, PipeWire не может создать рабочий выход. Подключи экран — и устройство появится само.
  • Не задан профиль. У нового устройства профиль off, пока не выбран цифровой выход. Звук при этом полностью отсутствует, а само устройство в списке есть.
  • По умолчанию выбран встроенный выход. WirePlumber смотрит на то, что доступно: если HDMI-сink в паузе или не проигрывает ничего, дефолтом остаются динамики ноутбука.
  • В потоке зашит другой выход. Приложение играет в устройство, которое ты переименовал или отключил, а PipeWire молча уводит звук туда, где остался дефолт.
  • Монитор не переключился на вход с ПК. Про HDMI надо помнить: звук и картинка идут по разным кнопкам на телевизоре, и вход может быть переключён на брадзер или антенну.
  • Модуль выгрузки энергосбережения. HDA-контроллеры любят засыпать, и после пробуждения кодек не просыпается.

Быстрая проверка журнала, если ничего из перечисленного не подходит:

journalctl --user -b | grep -iE "pipewire|wireplumber|alsa|hdmi" | tail -40
journalctl -k -b | grep -iE "snd_hda|nvidia" | tail -20

И не путай две разные поломки: если не работает сам HDMI-выход, то нет ни картинки, ни звука, и лечится это совсем в другом месте — про режимы вывода, DRM и modesetting написано в статье про DisplayPort и HDMI на NVIDIA.

Как задать профиль HDMI-выхода

Профиль живёт не в PipeWire, а в списке ALSA, и PipeWire показывает его как есть. Посмотреть варианты можно в wpctl status в секции Sinks, а задать — одной командой:

wpctl status
wpctl set-profile 47 output:hdmi-stereo
wpctl set-default 47
wpctl set-volume 47 0.60

47 — числовой идентификатор sink из вывода. Кроме output:hdmi-stereo встречаются профили output:hdmi-surround51, output:hdmi-surround71 и обычный output:stereo, который в мире PipeWire означает аналоговые колонки. Выбирай тот, который поддерживает твой монитор: у телевизора с наушниками на борту многоканальный профиль может оказаться лишним.

В сессии Wayland набор команд не меняется, при условии что сессия собрана правильно: без работающего compositor устройства и профили не появятся, и тогда сначала чинится видео, а не звук — как запустить такую сессию, описано в статье про включение Wayland с NVIDIA.

Грамотный способ — pavucontrol: там есть вкладка Configuration с выпадающим списком профилей и вкладка Output Devices, где устройство перетаскивается вверх и нажимается Set as Default. Для PulseAudio, если он остался в системе, команды такие же через pactl:

pactl list short sinks
pactl set-sink-profile alsa_output.pci-0000_01_00.1.analog-stereo output:hdmi-stereo
pactl set-default-sink alsa_output.pci-0000_01_00.1.analog-stereo

Как настроить автопереключение при подключении телевизора

WirePlumber умеет сам переезжать на HDMI, как только монитор с аудио появился, и возвращаться к колонкам, когда его отключили. По умолчанию это работает, если HDMI-sink называется «лучшим» для вывода, а вот фиксировать его вручную не стоит: тогда ноутбук останется без звука в поездке.

Что стоит проверить и настроить:

  • В pavucontrol или в настройках звука рабочего стола отметь HDMI-устройство как устройство по умолчанию для вывода, иначе ручное правило перебьёт автоматику.
  • В панели GNOME или Plasma оставь включённым автоматическое переключение на активный выход, если такая опция есть в версии твоей среды.
  • Тонкая настройка маршрутов живёт в конфигурации WirePlumber: пакет wireplumber-config кладёт примеры Lua-файлов в /etc/wireplumber/, где описаны политики выбора устройства.
  • Если поток уезжает не туда, проверь вкладку Streams в pavucontrol: у каждого приложения можно принудительно выбрать устройство.

Отдельная деталь про соединение: если ноутбук и монитор соединены конвертером или док-станцией, звук может не появиться вообще, потому что конвертер не передаёт аудиоканал. Тогда в списке устройств HDMI не будет вовсе, и настройками это не лечится.

Что делать, если звук пропадает после сна

Самая противная ситуация: до блокировки звук есть, после возвращения из сна HDMI молчит или вообще исчезает из списка. Порядок действий такой.

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

systemctl --user restart wireplumber
systemctl --user status wireplumber
wpctl status

Переназначить устройство дефолтным заново:

wpctl set-default 47
wpctl set-profile 47 output:hdmi-stereo

Включить persistence mode у драйвера NVIDIA, чтобы карта не теряла состояние при засыпании и просыпалась быстрее:

sudo nvidia-smi -pm 1

Более глубокая причина часто в агрессивном энергосбережении HDA-контроллеров. Параметр модуля отключает засыпание аудиокодека, и обрывов становится заметно меньше:

echo "options snd_hda_intel power_save=0" | sudo tee /etc/modprobe.d/sound.conf
sudo mkinitcpio -P

Если звук оживает только после переподключения кабеля, значит, просыпается HDMI-кодек монитора, и лечится это принудительным переподключением устройства:

wpctl set-default 47

Если же вместо тишины слышен треск, это уже не пробуждение, а рассинхронизация: клики, повторы, звук не совпадает с картинкой. Помогает принудительная переинициализация потока — закрой и запусти звучащее приложение снова либо перезапусти сессию. Про настройки самой карты и её питания в покое я писал в статье про перегрев NVIDIA и Coolbits: если видеокарта не спит и постоянно активна, сон и HDMI ведут себя заметно хуже.

Как проверить финальный результат

Проверяется всё в три шага, и каждый вывод должен быть осмысленным:

wpctl status                     # в Sinks есть устройство с активным профилем
aplay -l                         # карта NVIDIA на месте, есть устройство HDMI
speaker-test -c 2 -D default     # из колонок идут звуки пробуждения

Если speaker-test молчит, а в wpctl status sink отмечен как активный, переключи приёмник на нужный вход HDMI. Если в секции Sinks устройства нет вовсе, возвращайся к проверке aplay -l и журналу ядра — проблема ниже PipeWire. Порядок установки самого драйвера, если устройство пропало после обновления системы, разобран в статье про драйвер NVIDIA на Arch Linux.

Частые вопросы

В списке устройств только встроенный звук, NVIDIA не видно

Проверь lspci | grep -i audio — если контроллер есть в PCI, а в cat /proc/asound/cards его нет, дело в ядре. Убедись, что snd_hda_intel и snd_hda_codec_hdmi загружены, нет ли их в blacklist, и посмотри dmesg на предмет ошибок загрузки. Отдельно проверь, не выключен ли в UEFI режим вывода звука через видеокарту.

Sink есть, но звук идёт через встроенные динамики

Дефолтом назначен другой выход, либо конкретный поток направлен в колонки. Сделай HDMI устройством по умолчанию в wpctl set-default и проверь вкладку Streams в pavucontrol, где у каждого приложения выбирается устройство принудительно.

У монитора есть HDMI-вход, но звука нет

Проверь две вещи: вход телевизора переключён на тот порт, к которому подключён ноутбук, и громкость на самом мониторе не в ноль. Про HDMI стоит помнить, что он передаёт картинку и звук независимо, поэтому сломанное аудио не означает сломанную картинку.

Можно ли выводить звук на наушники и HDMI одновременно

В GNOME и Plasma есть режим одновременного вывода, и в pavucontrol можно перенаправить отдельный поток на другое устройство, а остальные оставить на HDMI. В PipeWire это собирается из профилей и модулей, но проще встроенный переключатель среды: он не ломает маршрутизацию.

Нужен ли профиль surround51 вместо hdmi-stereo

Выбирай по возможностям монитора. Если у телевизора только стерео или он подключён по устаревшей схеме, многоканальный профиль ничего не добавит, зато иногда ухудшает стабильность потока. Начни с output:hdmi-stereo, а если звук с искажениями — попробуй следующий доступный профиль.

Полезные ресурсы

Заключение

HDMI-звук NVIDIA — это отдельное HDA-устройство, которое почти всегда видно в ALSA, а PipeWire лишь отображает его как sink с профилем. Проверяй цепочку снизу вверх, начиная с lspci и aplay -l, держи профиль output:hdmi-stereo на устройстве, и после сна просто перезапускай сессию звука, не переустанавливая ничего.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max