Как только мне понадобилось использовать больше одного звукового потока (например завести весь звук, который проигрывается в системе в утилиту для записи с экрана или в тот же ardour5 завести несколько каналов одновременно) я столкнулся с отсутствием гибкости в ALSA1). Второй проблемой стало то, что некоторые проблемы прям физически дропают поддержку alsa и требуют поделку Лёни Пёттеринга pulseaudio.
В конечном итоге прогуглив интернеты и пообщавшись со знакомцами был рождён жизнеспособный сетап, который позволяет обслужить практически все утилиты, которые я использую и дают достаточно большую гибкость в работе с несколькими звуковыми девайсами2).
Итак, вкратце всё выглядит так:
ALSA ----> PulseAudio -----> JACK ----> ALSA
Выглядит как кольцо, однако всё не совсем так, как кажется на первый взгляд. Начнём по порядку.
Весь выхлоп от приложений заворачивается безусловно в PulseAudio. Просто потому что так проще.
pcm.!default { type pulse fallback "sysdefault" hint { show on description "Default ALSA Output (currently PulseAudio Sound Server)" } } ctl.!default { type pulse fallback "sysdefault" } # vim:set ft=alsaconf:
Является к сожалению3) основным звуковым сервером в системе. Работает, есть не просит, иногда сходит с ума и выбирает неправильный sink для вывода звука, но после пары отточенных ударов палкой всё становится снова хорошо.
У меня в конфиге default.pa от мейнтейнеров уже всё прописано, но всё же стоит убедиться, что в конфиге есть следующие строчки
... load-module module-jackdbus-detect channels=2 load-module module-jack-sink.so load-module module-jack-source.so ...
А ещё важный момент - нужно запретить этому негодяю автозапуск, иначе джэк на старте будет ругаться, что устройство занято и ваще. Соответственно делается это двумя правками в client.conf
autospawn = no daemon-binary = /bin/true
И убийством текущей пульсы
$ pulseaudio -k
Используется для коммутации разных звуковых каналов между собой. Я использую jack2, если что. Почему-то мейнтейнеры решили, что в новой версии пакета такие прекрасные приложения как alsa_in и alsa_out не нужны, хотя по сути Это не мейнтейнеры решили, а просто кто-то не очень очевидно описывает USE флаги. Чтобы утилитки alsa_in и alsa_out заехали нужно включить libsamplerate. Если у тебя в системе больше одной звуковой карты кроме как через эти прилаги сделать вывод/ввод сразу с двух карточек невозможно (jack умеет работать только с одним девайсом одновременно)
Для управления jack я использую qjackctl просто потому что есть вещи, которые удобнее делать мышкой, но наверняка можно и через jack_control крутить коннекты. Времени и желания разбираться не было, но это всегда может стать вашей домашкой, be careful with questions.
По умолчанию конечно же ничего не запускается, поэтому у меня в bspwmrc запускается скрипт инициализации, который на основании подключённых звуковых карточек делает ту или иную основной и выставляет нужные крутилки. Не будем далеко ходить
#!/bin/bash pidof alsa_in && pkill alsa_in pidof alsa_out && pkill alsa_out pulseaudio -k jack_control stop pidof jackd && kill jackd jack_control eps driver alsa if [[ -n "$1" ]]; then jack_control dps device hw:$1 jack_control dps playback hw:$1 jack_control dps capture hw:$1 elif [[ -n $(aplay -l | grep Pro) ]]; then jack_control dps device hw:Pro jack_control dps playback hw:Pro jack_control dps capture hw:Pro jack_control dps inchannels 2 jack_control dps outchannels 2 elif [[ -n $(aplay -l | grep 2i4) ]]; then jack_control dps device hw:USB jack_control dps playback hw:USB jack_control dps capture hw:USB jack_control dps inchannels 2 jack_control dps outchannels 4 else jack_control dps device hw:PCH jack_control dps playback hw:PCH jack_control dps capture hw:PCH jack_control dps inchannels 2 jack_control dps outchannels 2 fi jack_control start sleep 1 pulseaudio --realtime=false --exit-idle-time=-1 -L module-jack-sink -L module-jack-source -L module-native-protocol-tcp --start pacmd set-default-sink jack_out
У pulseaudio по умолчанию есть вредная привычка - когда в него никто не посылает сигнал - он просто берёт и выключается.
Если я, например, в данный момент использую Pro карту для вывода звука, то и ввод, очевидно, у меня может быть только с неё, однако в офисе, например, у меня нет микрофона, который можно засунуть в Pro карту, зато есть встроенный микрофон в PCH.
Здесь-то нам и понадобятся те утилитки, о которых я написал выше
$ alsa_in -d alsa -d hw:PCH
Прилага запускается в интерактивном режиме и создаёт source в jack, который можно уже скоммутировать с нужным output портом, которому требуется микрофон.