Мой текущий сетап

Как только мне понадобилось использовать больше одного звукового потока (например завести весь звук, который проигрывается в системе в утилиту для записи с экрана или в тот же ardour5 завести несколько каналов одновременно) я столкнулся с отсутствием гибкости в ALSA1). Второй проблемой стало то, что некоторые проблемы прям физически дропают поддержку alsa и требуют поделку Лёни Пёттеринга pulseaudio.

В конечном итоге прогуглив интернеты и пообщавшись со знакомцами был рождён жизнеспособный сетап, который позволяет обслужить практически все утилиты, которые я использую и дают достаточно большую гибкость в работе с несколькими звуковыми девайсами2).

Итак, вкратце всё выглядит так:

ALSA ----> PulseAudio -----> JACK ----> ALSA

Выглядит как кольцо, однако всё не совсем так, как кажется на первый взгляд. Начнём по порядку.

ALSA

Весь выхлоп от приложений заворачивается безусловно в PulseAudio. Просто потому что так проще.

~/.asoundrc
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:

PulseAudio

Является к сожалению3) основным звуковым сервером в системе. Работает, есть не просит, иногда сходит с ума и выбирает неправильный sink для вывода звука, но после пары отточенных ударов палкой всё становится снова хорошо.

У меня в конфиге default.pa от мейнтейнеров уже всё прописано, но всё же стоит убедиться, что в конфиге есть следующие строчки

...
load-module module-jackdbus-detect channels=2
load-module module-jack-sink.so
load-module module-jack-source.so
...

JACK

Используется для коммутации разных звуковых каналов между собой. Я использую jack2, если что. Почему-то мейнтейнеры решили, что в новой версии пакета такие прекрасные приложения как alsa_in и alsa_out не нужны, хотя по сути если у тебя в системе больше одной звуковой карты кроме как через эти прилаги сделать вывод/ввод сразу с двух карточек невозможно (jack умеет работать только с одним девайсом одновременно)

Для управления jack я использую qjackctl просто потому что есть вещи, которые удобнее делать мышкой, но наверняка можно и через jack_control крутить коннекты. Времени и желания разбираться не было, но это всегда может стать вашей домашкой, be careful with questions.

Запуск звуковой подсистемы

По умолчанию конечно же ничего не запускается, поэтому у меня в bspwmrc запускается скрипт инициализации, который на основании подключённых звуковых карточек делает ту или иную основной и выставляет нужные крутилки. Не будем далеко ходить

jack
#!/bin/bash
 
pidof alsa_in && pkill alsa_in
pidof alsa_out && pkill alsa_out
pulseaudio -k
jack_control stop
 
pidof jackd && kill jackd
if [[ -n $(aplay -l | grep Pro) ]]; then
  jack_control dps device hw:Pro
  jack_control dps playback hw:Pro
  jack_control dps capture hw:Pro
  #alsa_in -j PCH -d hw:PCH &
  #alsa_out -j PCH -d hw:PCH &
else
  jack_control dps device hw:PCH
  jack_control dps playback hw:PCH
  jack_control dps capture hw:PCH
fi
jack_control start
sleep 1
pulseaudio -D

Хитрости

Если я, например, в данный момент использую Pro карту для вывода звука, то и ввод, очевидно, у меня может быть только с неё, однако в офисе, например, у меня нет микрофона, который можно засунуть в Pro карту, зато есть встроенный микрофон в PCH.

Здесь-то нам и понадобятся те утилитки, о которых я написал выше

$ alsa_in -d alsa -d hw:PCH

Прилага запускается в интерактивном режиме и создаёт source в jack, который можно уже скоммутировать с нужным output портом, которому требуется микрофон.

1)
а может я просто неосилятор
2)
Тут тоже есть свои подводные камни
3)
или счастью