收到一位网友的咨询,在 Cadence 运行 ALSA -> JACK 时依然会经过 pulseaudio,我尝试后的确如此。 在分别比较了 JACK 命令行、QjackCtl 和 Cadence 的启动过程后,发现了原因所在。 以下为正文。
多谢网友 Alynx Zhou 的指正,AlSA 独占的情况在多声卡下是不独占的,ALSA 独占只存在“单声卡”。同时使用 jack2-dbus 才能让多声卡不独占(声卡A pulseaudio 和 声卡B JACK 同时分别发声)。
JACK 直接连接 ALSA 时为“独占”
首先要知道的是,如果想要 ALSA -> JACK 直通,即不经过 pulseaudio,pulseaudio 和 JACK 是不能良好运行的(指同时接到 ALSA)。
在官网的"How use PulseAudio and JACK?"页面有解释[1]:
- While PulseAudio is running, JACK cannot access the same soundcard that Pulse is using. Even though in theory ALSA provides mechanisms for this to be possible (e.g. “dmix” device access), they do not work well enough to support both of these systems reliably.
这意味着我们在使用 ALSA -> JACK 时,需要停用 pulseaudio。
.asoundrc 文件定义 JACK 如何连接
在用户目录下有一个.asoundrc
文件,这个文件定义了 JACK 如何连接到 ALSA。
你可以在 Cadence 切换 Bridge Type,这个行为改变了当前用户下的.asoundrc
文件。
如果.asoundrc
是你自行建立/编辑的,在 Cadence 中就会显示为“cutsom”。
Pulseaudio bridge to JACK 做了什么
Cadence 中开启了 pulseaudio bridge 后,便完整实现 ALSA -> Pulseaudio -> JACK 的音频信号流。
如果你在用 QjackCtl 的话,在 Startup scripts 里执行pactl load-module module-jack-sink channels=2; pactl load-module module-jack-source channels=2; pacmd set-default-sink jack_out
也是相同的效果[2][3]。
换句话来说,如果想要 ALSA 直通 JACK,便不能开启 pulseaudio bridge。
总结这两种连接方式
-
ALSA -> JACK
- 你的
.asoundrc
文件内容要符合这个连接方式(Cadence 选择 Bridge Type 可自动生成)。 - 停止/不开启 pulseaudio bridge
- 你的
-
ALSA -> pulseaudio -> JACK
- 你的
.asoundrc
文件内容要符合这个连接方式(Cadence 选择 Bridge Type 可自动生成)。 - 必须开启 pulseaudio bridge
- 你的
参考资料
- https://jackaudio.org/faq/pulseaudio_and_jack.html
- https://github.com/jackaudio/jackaudio.github.com/wiki/WalkThrough_User_PulseOnJack
- https://github.com/falkTX/Cadence/blob/b82db9af8d/data/cadence-pulse2jack
本作品采用知识共享署名 4.0 国际许可协议进行许可。