Видеокарта NVIDIA умеет отдавать звук по HDMI не хуже встроенной звуковой карты: в ней есть собственный аудиоконтроллер, и система видит его как обычное HDA-устройство. Проблема начинается, когда карта есть, а в PipeWire нет ни одного HDMI-sink, или он есть, но звук уходит в колонки ноутбука. Разбираемся, где искать устройство, как задать профиль и что делать, если звук исчезает после сна.
Внутри любой дискретной карты, включая 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
Самые частые причины, по возрастанию частоты:
off, пока не выбран цифровой выход. Звук при этом полностью отсутствует, а само устройство в списке есть.Быстрая проверка журнала, если ничего из перечисленного не подходит:
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.
Профиль живёт не в 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-устройство как устройство по умолчанию для вывода, иначе ручное правило перебьёт автоматику.wireplumber-config кладёт примеры Lua-файлов в /etc/wireplumber/, где описаны политики выбора устройства.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.
Проверь lspci | grep -i audio — если контроллер есть в PCI, а в cat /proc/asound/cards его нет, дело в ядре. Убедись, что snd_hda_intel и snd_hda_codec_hdmi загружены, нет ли их в blacklist, и посмотри dmesg на предмет ошибок загрузки. Отдельно проверь, не выключен ли в UEFI режим вывода звука через видеокарту.
Дефолтом назначен другой выход, либо конкретный поток направлен в колонки. Сделай HDMI устройством по умолчанию в wpctl set-default и проверь вкладку Streams в pavucontrol, где у каждого приложения выбирается устройство принудительно.
Проверь две вещи: вход телевизора переключён на тот порт, к которому подключён ноутбук, и громкость на самом мониторе не в ноль. Про HDMI стоит помнить, что он передаёт картинку и звук независимо, поэтому сломанное аудио не означает сломанную картинку.
В GNOME и Plasma есть режим одновременного вывода, и в pavucontrol можно перенаправить отдельный поток на другое устройство, а остальные оставить на HDMI. В PipeWire это собирается из профилей и модулей, но проще встроенный переключатель среды: он не ломает маршрутизацию.
Выбирай по возможностям монитора. Если у телевизора только стерео или он подключён по устаревшей схеме, многоканальный профиль ничего не добавит, зато иногда ухудшает стабильность потока. Начни с output:hdmi-stereo, а если звук с искажениями — попробуй следующий доступный профиль.
snd_hda, энергосбережение кодеков.HDMI-звук NVIDIA — это отдельное HDA-устройство, которое почти всегда видно в ALSA, а PipeWire лишь отображает его как sink с профилем. Проверяй цепочку снизу вверх, начиная с lspci и aplay -l, держи профиль output:hdmi-stereo на устройстве, и после сна просто перезапускай сессию звука, не переустанавливая ничего.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии