Короче, есть такая конфигурация ALSA->JACK: дефолтный plug -> dmix -> loopback -> dsnoop -> alsa_in -> JACK (кусок .asoundrc ниже, без capture части, она сейчас не важна).
pcm.!default {
type plug
slave {
pcm "aloopDuplex"
format S32_LE
}
}
pcm.aloopPlayback {
type dmix
ipc_key 1
ipc_key_add_uid true
slave {
pcm "hw:Loopback,0,0"
format S32_LE
# rate 48000 # default
period_size 1024
buffer_size 4096
}
}
# duplex device
pcm.aloopDuplex {
type asym
playback.pcm "aloopPlayback"
capture.pcm "aloopCapture"
}
# ------------------------------------------------------
# alsa_in -j alsa_in -d cloop -r 48000 -q 1
pcm.cloop {
type dsnoop
ipc_key 3
ipc_key_add_uid true
slave {
pcm "hw:Loopback,1,0"
format S32_LE
# rate 48000 # default
period_size 1024
buffer_size 4096
}
}
Формат S32_LE выбран для совместимости с JACK (потому что он обычно запускается первым и alsa_in
создаёт свой конец loopback’а с таким форматом).
В принципе, в таком виде всё даже работает, НО. Битрейт в алсовской части, как видно, везде дефолтный 48000. Сам JACK сидит на 96000, поэтому получается двойная конвертация: сначала из источника (с каким-то своим битрейтом) plug
делает 48000, а потом уже alsa_in
96000. Мне так показалось, что можно от этого избавиться, указав везде rate 96000 для Алсы, чтобы конверсия была один раз, на стороне plug
. Попробовал — ИЧСХ, оно даже работает со speaker-test
, например. Но вот Файрфокс, ска, отказывается цепляться к дефолтному устройству с какой-то невнятной диагностикой, чего-то там про MediaSinkAudioError.
Сначала подумал, что ему вообще битрейт выше 48000 не нравится, но он таки цепляется и звук выводит, если: а) запустить через apulse (пульсы в системе нет); или б) если дефолтным устройством задать непосредственно звуковуху, работающую на зажатом битрейте 96000.
ХЗ, чего ему может не нравиться. Ну, то есть, скорей всего, какой-то косяк в его поддержке Алсы, которую афтары постепенно deprecate’ят, но вдруг я чего-то ещё в конфиге не учёл?