Внешние звуковые карты (USB DAC): как заставить работать
Подключил внешнюю звуковую карту, а звука нет — в девяти случаях из десяти дело не в железе, а в одном из четырёх слоёв: USB-подсистема, модуль snd_usb_audio, карта в ALSA или профиль в PipeWire. Поскольку класс USB Audio Class ядро поддерживает из коробки, DAC чаще всего взлетает без единой настройки, а вот сломанный — требует пройти слои сверху вниз. Проверки занимают минуту и сразу показывают, на каком шаге всё встало.
С чего начать: видит ли система USB-карту?
Прогони четыре команды по порядку — вывод каждой сужает круг подозреваемых:
lsusb | grep -iE 'audio|sound'
aplay -l
wpctl status
dmesg | grep -iE 'usb|audio|snd' | tail -20
cat /proc/asound/cards
lsusbмолчит — до ALSA дело не дошло. Проверь порт, кабель, хаб, а вdmesgпоищиerror -71иdevice descriptor read.lsusbвидит устройство,aplay -lпуст — не загрузился модульsnd_usb_audio.aplay -lпоказывает карту, а вwpctl statusеё нет — сбой на уровне пользователя: PipeWire не подхватил ALSA-карту. Проверь, что пользователь в группахaudioиvideo, и посмотри разбор конфликта PipeWire и PulseAudio./proc/asound/cardsпоказывает карту с именем вродеUSB-Audio— ядро её увидело, дальше работаешь с профилями.
Полезная привычка: обращаться к карте не через hw:0,0, а через hw:CARD=USB,DEV=0. Имя по буквам не путается, когда после перезагрузки индексы съезжают.
Почему карта есть в lsusb, но не появилась в списке?
lsmod | grep snd_usb
sudo modprobe snd_usb_audio
В Arch модуль уже собран в ядре, поэтому ручной modprobe нужен только когда карта «залипла» после горячего отключения. Тогда сначала выгружаем, потом перевтыкаем:
sudo modprobe -r snd_usb_audio
# вытащи карту и воткни обратно
sudo modprobe snd_usb_audio
dmesg | tail -20
Из сообщений ядра видно типовые причины:
cannot submit URB: -28— не хватает питания или пропускной способности, пересади карту на порт USB 2.0 напрямую, без хаба.Failed to submit URBиerror -71— кабель или разваливающийся хаб.reset SuperSpeed USB deviceпри смене трека — питания и полосы не хватает, см. раздел про шум.
Часть дешёвых DAC не умеет отдавать нужный USB-интерфейс, и ядру подсказывают это параметром quirk. Значение берётся из lsusb -v — строки idVendor, idProduct и bInterfaceNumber:
lsusb -v -d 1234:5678 | grep -E 'idVendor|idProduct|bInterfaceNumber'
# /etc/modprobe.d/usb-audio.conf
options snd-usb-audio quirk=0x1234x5678x00
sudo modprobe -r snd_usb_audio && sudo modprobe snd_usb_audio
Второй рычаг — энергосбережение. Карта, ушедшая в autosuspend, просыпается щелчком в колонках:
cat /sys/module/usbcore/parameters/autosuspend
Если там 2 (таймаут в секундах) или 0 для отдельных устройств, выключи приостановку глобально:
echo 'options usbcore autosuspend=-1' | sudo tee /etc/modprobe.d/usb-no-autosuspend.conf
И последний крайний приём — «чёрный список USB» для конфликтующих хабов и устройств в /etc/modprobe.d/blacklist.conf, плюс usbcore.quirks=vvvv:pppp:x в том же каталоге, где буква x в конце отключает устройство целиком.
Как дать карте постоянное имя?
hw:0,0 — привязка к индексу, CARD=Device — бесполезный мусор. Устойчивое имя делает udev, читая серийный номер:
# /etc/udev/rules.d/90-usb-dac.rules
KERNEL=="card[0-9]*", SUBSYSTEM=="sound", ATTRS{serial}=="*", ACTION=="add", \
RUN+="/bin/sh -c 'echo %k {ATTR{serial}} | /usr/bin/speaker-id $(cat /proc/asound/%k/id)'"
sudo udevadm control --reload-rules
sudo udevadm trigger --subsystem-match=sound
aplay -l
/usr/bin/speaker-id приходит с пакетом alsa-utils. Через пару перезагрузок aplay -l начнёт печатать имя из серийника, а в wpctl status появится внятный идентификатор карты вместо alsa_output.usb-..._DEV_0.
Почему это принципиально: WirePlumber и PipeWire помнят маршруты по ALSA-имени, а не по позиции в списке. Меняется индекс после ребута — слетают все настройки. Мой подход к устойчивому переключению профилей и карт описан здесь.
Какие профили выбирать у USB DAC?
Список профилей смотрится на лету:
wpctl introspect <ID-устройства> | grep -A30 'Profiles'
Набор почти всегда один и тот же:
output:analog-stereo+input:analog-stereo— обычный комплектный USB-адаптер с линейным входом и выходом.output:analog-stereo— только выход, микрофон остаётся на встроенной карте.output:digital-stereo— S/PDIF по коаксилу или оптике.pro-audio— «сырая» пара дорожек: без микса, без автоматического подмешивания, ровно то, что отдал плеер.
Для музыки разумно выбирать pro-audio: никакого dmix, никаких неожиданных пересчётов. Для S/PDIF нужен output:digital-stereo плюс бит-перфектт в самом плеере, иначе ресемплинг 44.1 → 48 кГц гарантирован.
24 бита и 192 кГц отдельным профилем не выглядят — это параметры формата. Что карта реально умеет, покажет:
cat /proc/asound/card1/stream0
Заставить всю систему работать на 192 кГц можно глобально:
mkdir -p ~/.config/pipewire/pipewire.conf.d
# ~/.config/pipewire/pipewire.conf.d/50-rate.conf
context.properties = {
default.clock.rate = 192000
}
А задержка?
pw-cli list-objects Node | grep -E 'node.name|node.latency'
Значение по умолчанию (1024 на 48000, около 21 мс) для музыки незаметно, для записи мысленно избыточно. Подкрутить:
# /etc/pipewire/pipewire.conf.d/20-quantum.conf
context.properties = {
node.default.clock.quantum = 1024
node.default.clock.min-quantum = 256
}
Почему громкость не регулируется?
Симптомы знакомые: ползунок есть, но не двигается, либо его нет вовсе; в одном приложении тихо при 100% в системном микшере.
pactl list sinks | grep -A6 Volume
wpctl get-volume @DEFAULT_SINK@
Механика в том, что у внешнего DAC два независимых уровня: аппаратный регулятор в микросхеме карты и программный том в графе PipeWire. Если у DAC регулятора нет, у ALSA-карты не будет элемента управления Volume — но софтверный уровень всё равно считается.
Проверь напрямую, минуя любые графические оболочки:
wpctl set-default <ID нужного sink>
wpctl set-volume @DEFAULT_SINK@ 50%
wpctl get-volume @DEFAULT_SINK@
Громкость изменилась — софт работает, вопрос только в шкале. Не изменилась, потому что регулятор на железе перехватывает уровень: принуди включи программный том отдельным узлом-фильтром.
# /etc/pipewire/pipewire.conf.d/20-soft-volume.conf
context.objects = [
{
factory = filter
args = {
node.name = "soft-volume"
filter.name = "volume"
}
}
]
systemctl --user restart pipewire wireplumber
wpctl status
Имя узла может немного отличаться от soft-volume в зависимости от версии PipeWire, поэтому идентификатор лучше взять из вывода wpctl status и сделать его дефолтным.
На большинстве карт с крутилкой задача решается проще: не трогай системный том вообще, крути ручку и держи софт на максимуме.
Как убрать шум, треск и фон
Сначала посмотри, что пишет ядро:
dmesg | grep -iE 'reset super|disconnect|snd_usb'
reset SuperSpeed USB device— карта теряет связь с хабом. Убери хаб, замени кабель, подведи питание.- Щелчок на каждом треке — autosuspend, лечится значением
-1из раздела выше. - Фон 50/60 Гц и лёгкое шуршание — не софт, а земля и питание.
Железная часть:
- питание карты — отдельным блоком, а не из хаба или удлинителя;
- одна розетка (лучше один удлинитель с фильтром) на компьютер, карту, усилитель;
- экранированный кабель, до полутора метров, без цепочки переходников;
- если комп и усилитель в разных ветках сети — сначала попробуй общий сетевой фильтр, потом уже ищи землю в акустике.
Программная часть: найди источник, который играет громче остальных.
pactl list sink-inputs | grep -E 'Sink Input|Corked|Volume'
Тот поток, у которого свой уровень отличается от системного, и есть источник тихого звука. Если подозрение на WebRTC, сбросить сохранённые громкости приложений помогает перезагрузка модуля:
pactl unload-module module-stream-restore
pactl load-module module-stream-restore
Как сделать USB DAC картой по умолчанию?
wpctl status
wpctl set-default <ID нового sink>
wpctl set-default <ID нового source>
WirePlumber запоминает выбор и восстанавливает его после перезагрузки, так что настройку не придётся повторять. Проверяется повторным wpctl status: у дефолтного устройства стоит звёздочка.
Встроенная карта при этом никуда не денется и может забрать маршрут, если что-то её разбудит. Временно убрать её можно так:
cat /proc/asound/cards
sudo modprobe -r snd_hda_intel
Постоянно:
# /etc/modprobe.d/blacklist.conf
blacklist snd_hda_intel
Плата — микрофон ноутбука и встроенные динамики. Поэтому чаще достаточно снять с неё маршрут по умолчанию, не выгружая драйвер. Если после смены карты звук пропал целиком, у меня есть гайд по тишине в PipeWire — начни с него, там короче.
Частые вопросы
Карта работает в Windows, а в Linux её не видно — в чём разница?
Windows ставит родной драйвер с панелью управления и умеет больше: там есть и MIDI, и многоканальный вывод, и настройки эквалайзера. Linux опирается на USB Audio Class, поэтому функций меньше, но базовая работа из коробки. Если даже она не работает — начинай с четырёх команд диагностики, дальше смотри сообщения dmesg. Совсем экзотика — дешёвые карты, у которых весь тракт реализован как vendor-специфичный интерфейс: там спасает quirk для snd-usb-audio.
Как узнать серийный номер карты для udev-правила?
udevadm info --query=all --name=/dev/snd/controlC1 | grep -i ID_SERIAL
Если ничего нет, значит карта серийника не сообщает — тогда привязывай правило к ATTRS{product}=="*" и вставляй ATTRS{product} вместо ATTRS{serial}.
Можно ли вывести звук сразу на две USB-карты?
Да, через совместимость PulseAudio, которая есть в PipeWire:
pactl list short sinks
pactl load-module module-combine-sink sink_name=dual slaves=sink_name_1,sink_name_2
Дальше приложения пишут в dual, а он уже раздаёт поток в обе карты. Работает и с наушниками, и с линейным выходом — удобно, когда в комнате два усилителя.
Полезные ресурсы
Заключение
Большинство «мёртвых» USB-карт чинятся не переустановкой, а последовательной проверкой: lsusb → aplay -l → wpctl status → dmesg, а затем модуль, профиль и имя карты. Потраченные пять минут почти всегда дают точный ответ, а стойкое имя от udev избавляет от повторной настройки после каждой перезагрузки.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии