如何在同一音频设备上同时使用 JACK 和 Pulseaudio/ALSA?

And*_*ann 49 pulseaudio jack

每当我启动 Hydrogen 时,它会在所有其他使用 Pulse 的应用程序中破坏我的音频,例如,在启动 Hydrogen 一次后,我无法再在 Chrome 中播放视频,直到我重新启动我的电脑或执行 sudo alsa force-reload。我发现有类似问题的人,但没有解决此问题的实际指南,通常有指向http://jackaudio.org/pulseaudio_and_jack(已移至http://jackaudio.org/faq/pulseaudio_and_jack.html)的链接我我正在使用 Ubuntu Studio 14.04 64 位。

或者,如果这真的不可能实现,有人能告诉我如何在一个声卡上使用 Jack 而在另一个声卡上使用 Pulse 吗?这样我就可以只在需要 JACK 时插入 USB 声卡。

请不要让我使用窗户。

小智 50

从 16.04 开始,事情变得简单多了 :)

只需安装qjackctlpulseaudio-module-jack模块:

apt-get install qjackctl pulseaudio-module-jack
Run Code Online (Sandbox Code Playgroud)

然后配置qjackctl启动后运行如下命令。将其复制到“设置...”>“选项”>“启动后执行脚本”:

pacmd set-default-sink jack_out
Run Code Online (Sandbox Code Playgroud)

就是这样。Pulseaudio 将识别(通过 D-Bus)JACK 启动,并自动将音频路由到它。当 JACK 停止时,Pulseaudio 将恢复正常路由并再次开始直接向卡发送音频。

所以(几乎)默认情况下,Pulseaudio 实现了上面由 mmv-ru 详述的设置。

  • pactl set-default-sink jack_out ->“失败:没有这样的实体” (9认同)
  • @KarlMorrison,您可能需要在此之前执行 `pactl load-module module-jack-sink channels=2` 和 `pactl load-module module-jack-source`,请参阅 @kim-tucker 答案。 (8认同)
  • 这些组合都不适用于 Debian,使用 pactl 或 pacmd。我说我们都将pulseaudio报告为损坏的软件,因为其中一些发行版维护者显然在它准备好之前将其作为默认值。 (4认同)
  • 正确的命令是“pacmd set-default-sink jack_out”。不幸的是,我无法更正答案,因为编辑必须超过 6 个字符!:-( (2认同)
  • 乌班图20.04。我必须选择 `pactl load-module module-jack-sinkchannels=2; pactl 加载模块 module-jack-source; pacmd 设置默认接收器 jack_out`。详细解答如下 (2认同)

小智 21

这个 Youtube 视频:“Jack 和 PulseAudio 一起成为朋友 - Linux”似乎有一些答案:

解决方案的关键似乎是确保安装了pulseaudio-module-jack:

aptitude install pulseaudio-module-jack
Run Code Online (Sandbox Code Playgroud)

然后 sudo 编辑 /etc/pulse/default.pa 文件以在手动加载音频驱动程序部分下包含两行:

load-module module-jack-sink
load-module module-jack-source
Run Code Online (Sandbox Code Playgroud)

然后 - 我想 - 重新启动pulseaudio。我刚刚重新启动了 PC(懒惰,我知道)并且它起作用了......启动Ardor不再杀死pulseaudio,他们一起玩得很开心。


mmv*_*-ru 11

我在 Fedora 23 上工作的解决方案。

dnf install jack-audio-connection-kit jack-audio-connection-kit-dbus qjackctl
Run Code Online (Sandbox Code Playgroud)

不要触摸 /etc/pulse/default.pa !

配置 qjackctl

设置

~/.config/rncbc.org/QjackCtl.conf 的相关片段:

[Settings]
Server=jack_control start
Driver=alsa
InDevice="hw:PCH,0"
OutDevice="hw:PCH,0"
Run Code Online (Sandbox Code Playgroud)

选项

可以通过以下方式找到 pactl 的接收器名称:

pacmd list-sinks
Run Code Online (Sandbox Code Playgroud)

这是 ~/.config/rncbc.org/QjackCtl.conf 的另一个片段来显示完整的命令

[Options]
...
StartupScript=true
StartupScriptShell=pactl suspend-sink alsa_output.pci-0000_00_1b.0.analog-stereo 1
PostStartupScript=true
PostStartupScriptShell=pactl set-default-sink jack_out
ShutdownScript=false
ShutdownScriptShell="pactl unload-module module-jack-sink; pactl load-module module-jack-source"
PostShutdownScript=true
PostShutdownScriptShell="pactl suspend-sink alsa_output.pci-0000_00_1b.0.analog-stereo 0; pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo"
Run Code Online (Sandbox Code Playgroud)

杂项 “启用 D-Bus 接口”对于 Qjackctl 本身很重要。

这个怎么运作

现在,在启动时,PC 仅使用 PulseAudio 运行,一切都会像没有 Jack 一样自动运行。

启动 Qjackctl 后,

  1. Qjackctl 启动脚本会暂停 Pulseaudio 中的主声卡,并允许 Jack 访问它: pactl suspend-sink alsa_output.pci-0000_00_1b.0.analog-stereo 1
  2. Jack 通过 d-bus 启动: jack_control start
  3. Pulse 通过 D-Bus 自动检测插孔启动并加载插孔接收器和插孔源。
  4. 启动脚本后的Qjackctl将Pulse中的默认接收器更改为jack_out:(pactl set-default-sink jack_out起初看起来没有必要,因为所有正在运行的PA客户端都切换到新接收器,但是如果没有此命令,新应用程序将卡在挂起的接收器上)

因此系统被重新配置为使用“杰克顶部的脉冲”。(我跳过硬件输入暂停,因为我不使用它)

如果未选中“在应用程序退出时停止 JACK 音频服务器”,我可以关闭 Qjackctl 并重新运行它而不会干扰设置。

用 Qjackctl 阻止 Jack 后,一切都恢复到简单整洁的 Pulse!

  1. Jackd 通过 dbus 被 Qjackctl 停止 - “启用 D 总线接口”选项。
  2. jack-source 和 jack-sink 由 d-bus 自动从 Pulseaudio 中删除
  3. Pulse 音频中的默认接收器切换到声卡,因为 jack-out 消失
  4. 关闭脚本后的 Qjackctl 重新激活 Pulseaudio 中的声卡: pactl suspend-sink alsa_output.pci-0000_00_1b.0.analog-stereo 1

使用的工具

  1. jackd(来自包pulseaudio-utils)
  2. jack_control(来自 ack-audio-connection-kit-dbus 包)
  3. Qjackctl(来自包pulseaudio-utils)
  4. pactl 从脚本控制 Pulseaudio(来自包pulseaudio-utils)
  5. LANG=C pacmd list-sinks|grep -E "index:|name:|alsa.long_card_name =|alsa.name ="LANG=C pactl list sinks|grep -E "(Sink #|Name:|alsa.long_card_name =|alsa.name =)"检测 alsa 设备名称


lau*_*geo 7

  • 问题是 Hydrogen (as Ardour) 在启动时启动 jackd 但不要在退出时关闭它:
    但是您可以killall jackd在 Hydrogen 退出后在终端中运行。

  • 同时使用 Jack 和 pulseaudio 软件的一种复杂方法是​​安装“pulseaudio-module-jack”(如果不存在,还安装 qjackctl(jackd gui)和 pavucontrol)。重新启动脉冲音频pulseaudio -k
    现在关闭音频应用程序(Jack 和 pulseaudio),
    使用 qjackctl 运行 jackd(单击开始按钮)(必须在 qjackctl 设置最后一个选项卡中选择 dbus 选项)。
    在 Pavucontrol 的“输出设备”选项卡中,单击“插孔接收器”附近的绿色“默认设备”按钮
    现在pulseaudio 软件和 Hydrogen 应该同时运行。

  • 使用 qjackctl,在第一个“设置”选项卡中,您可以更改 Jackd 音频设备。


Fah*_*hik 7

将所有系统路由到与 jack 一起运行的最简单方法:

安装

sudo apt-get install qjackctl pulseaudio-module-jack
Run Code Online (Sandbox Code Playgroud)

打开 qjackctl。在设置>选项>

检查启动后执行脚本并粘贴:

pacmd load-module module-jack-source channels=2; pacmd load-module module-jack-sink channels=2;
Run Code Online (Sandbox Code Playgroud)

检查关机后执行脚本并粘贴:

killall jackd
Run Code Online (Sandbox Code Playgroud)

现在启动 qjack 并打开您的声音设置。您会发现脉冲音频插孔接收器输出端口。选择它,所有系统将同步。如果您停止 Jack server/qjack,声音将再次回到您的默认端口。

[这里是整体视图]

在此处输入图片说明


Jér*_*ôme 7

2020 更新。Debian 克星。希望也适用于 Ubuntu。

不再需要使用任何脚本。

安装pulseaudio-module-jack. 它包含一个模块,负责检测千斤顶何时启动以及从/向其中提供/下沉。

您可以在pulseaudio配置文件中检查:

/etc/pulse/default.pa

### Automatically connect sink and source if JACK server is present
.ifexists module-jackdbus-detect.so
.nofail
load-module module-jackdbus-detect channels=2
.fail
.endif
Run Code Online (Sandbox Code Playgroud)

确保 jackdbus 已启动。如果使用 qjackctl 启动 jack,请在 Setup -> Misc 中检查 dbus 复选框。

这应该是全部。


Bru*_*der 6

Ubuntu 20.04,我发现它是各种答案的混合

  1. 安装 JACK 和 QJackCtl 以及 JACK 的脉冲音频接收器和源
sudo apt-get install qjackctl pulseaudio-module-jack
Run Code Online (Sandbox Code Playgroud)
  1. 启动 QJackCtl 并在Setup...--> Options-->Execute script after Startup粘贴以下内容:
pactl load-module module-jack-sink channels=2; pactl load-module module-jack-source; pacmd set-default-sink jack_out
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  1. 启动 JACK,在 QJackCtl 中,PulseAudio Sink 和 Source 应该连接到系统 在此处输入图片说明

  2. 在 Ubuntu 设置中,选择 JACK Sink 作为输出

在此处输入图片说明


小智 5

现在可能容易多了。今天,在全新安装 Linux Mint 18.2(Ubuntu 16.04 软件包基础)后,满足我真正基本需求的对我有用的是:

  1. 使用 Synaptic 安装 QSynth 和 QJackCtl。

  2. 将所需的声音字体复制到适当的文件夹中,例如/usr/share/sounds/sf2/

  3. QSynth 设置中:在“音频”选项卡下将“音频驱动程序”更改为“pulseaudio”

  4. QSynth 设置中:在SoundFonts下:打开...并根据需要选择一个。

  5. QJackCtl 设置 > 设置 > 高级中:

    服务器前缀:pasuspsender --/usr/bin/jackd

  6. QJackCtl 设置 > 选项中:

    启动后执行脚本:

    pactl load-module module-jack-sink channels=2; pactl load-module module-jack-source; pacmd set-default-sink jack_out
    
    Run Code Online (Sandbox Code Playgroud)
  7. QJackCtl Connect 中: ALSA:将左侧的键盘输入连接到右侧的FLUID Synth 。

  8. 在声音的主系统设置中,选择所需的输出设备。

现在我可以在观看视频时弹奏键盘(例如,使用 Firefox 在 YouTube 上) - 以前我一次只能执行其中一项操作,而无需进行大量我很少跟踪的调整。

希望对某人有所帮助,或鼓励他们再试一次:-)。


tob*_*ora 5

有两种方法可以回答这个问题。

\n
    \n
  1. 要么尝试让杰克与pulseaudio一起工作......这个问题的其余部分将解释如何做到这一点。
  2. \n
  3. 或者...不要尝试同时使用pulseaudio和jack,只需用pipewire替换它们:pipewire应该是“新的pulseaudio”(我认为它应该在某些时候取代pulseaudio,并且已经比脉冲音频并支持更多蓝牙选项)。Pipewire同时模拟pulsaudio和jack,并且可以无缝地与pulseaudio/qjackctl/...一起使用,将pulseaudio和jack应用程序连接在一起(基本上pipewire在pulseaudio应用程序和jack\xe2\x80\xa6之间没有太大区别大多数时候我什至不确定我正在使用的应用程序是否正在运行jack或pulseaudio)。如果您真的想要疼痛并使用pulseaudio + jack...这个问题的其余部分是给您的。
  4. \n
\n

不久前,我写了一个命令,有人报告我,在尝试了这里的所有解决方案后,他运气不好。但这个解决方案对他有用,所以我将其发布在这里,以防其他人可以得到帮助。注意:我并不是说这个解决方案是最优雅的,但它对我来说做得很好:

\n
    \n
  • 我只需单击启动/停止按钮即可启动/停止插孔,并且在pulseaudio和pavucontrol之间自动切换
  • \n
  • 它会自动将所有当前的播放软件连接到jack(这就是为什么有这个丑陋的grep,如果你有更好的解决方案,请告诉我)
  • \n
  • 它还确保pulseaudio应用程序也可以使用麦克风
  • \n
\n

通过在退出 Jack 时正确卸载模块,可以稍微改进这个解决方案,也许使用这里提出的丑陋的 grep ,但我并没有真正发现对我有任何好处。

\n

另请注意,我给出了有关如何调试此类问题的非常详细的说明。

\n

我的解决方案(请参阅下面的理论以了解其工作/失败的原因并调试任何潜在问题)

\n

安装:

\n
$ sudo apt install jack2 pavucontrol qjackctl pulseaudio-module-jack. \n
Run Code Online (Sandbox Code Playgroud)\n

运行 qjackctl:

\n
$ qjackctl\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

单击Setup,然后检查输出接口是否正确(例如,如果您有 HDMI 输出,则此检查可能很重要)。就我而言,我将仅使用默认值,如果稍后遇到问题,我将返回此处。\n在此输入图像描述

\n

然后,在高级选项卡中,我将服务器前缀替换jackdpasuspender -- jackd. 这应该告诉pulseaudio暂时让jack管理声卡。我不确定它是否真的需要,但我想它不会造成伤害:\n在此输入图像描述

\n

然后,在“选项”选项卡中输入Execute script after Startup以下代码:

\n
pactl load-module module-jack-sink && pactl load-module module-jack-source && pactl set-default-sink jack_out && pacmd set-default-source jack_in && pacmd list-sink-inputs | grep index | sed \'s/ *index: *//g\' | xargs -I{} pacmd move-sink-input "{}" jack_out\n
Run Code Online (Sandbox Code Playgroud)\n

该命令的目标是为pulseaudio创建指向jack的新输出(sink),默认启用这个新sink(所有新打开的应用程序将写入jack),并且它还将所有现有应用程序的输出更改为确保它们指向杰克。

\n

然后,为了确保在插孔关闭时pulseaudio重新启动,我还在字段中添加了Execute script after Shutdown

\n
pacmd suspend false\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

就是这样!现在,您只需单击保存Apply并单击Start即可启动杰克:

\n

在此输入图像描述\n如果它有效的话你应该看到类似的东西(当然没有错误):\n在此输入图像描述

\n

一些理论来理解它为什么有效,或者为什么失败

\n

所以基本上,您无法播放声音,因为同一声卡上只有一个程序可以同时播放声音。因此,当 Jack 演奏时,pulseaudio 会被阻止。现在,事实证明大多数桌面应用程序可以与pulseaudio 对话,但不能与Jack 对话。因此,当杰克打开时,您就不再有声音了。诀窍是将pulseaudio 流量路由到Jack,如下所示:

\n
application -> pulseaudio -> Jack -> sound card\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,所有链接都必须正确配置。我们现在将了解它们是如何配置的以及如何检查它们是否配置正确。

\n

因此,为了创建链接,pulseaudio -> Jack我们将加载一个模块,该模块创建一个新的pulseaudio接收器(即虚拟输出设备),名为Jack sink:这样,在该接收器中写入的任何应用程序都将被重定向到Jack上。您可以拥有多个现有的接收器,例如用于内部音频的接收器,如果您有蓝牙耳机,则也可以为其拥有一个接收器。要检查应用程序实际正在播放的接收器,请安装并运行pavucontrolpavucontrol对于所有与声音相关的东西来说都非常有用,因为您基本上可以控制其中的所有内容)。您可以在名为类似的选项卡中看到接收器列表Input devices(抱歉,如果翻译不好),在我的例子中,我现在有 2 个接收器(杰克尚未加载):\n在此输入图像描述

\n

如果您只有一个接收器,您可能看不到任何有趣的东西,但如果您有多个接收器,您可以在第一个选项卡中检查哪个应用程序正在哪个接收器上播放(在这里您可以看到 Firefox 正在我的蓝牙耳机上播放),并且如果需要,您可以更改它:

\n

在此输入图像描述

\n

因此,如果您遇到一些问题,您可以:

\n
    \n
  1. 链接:检查您是否有与 jack 相对应的接收器(如果没有,请尝试手动运行应该自动运行的pulseaudio -> jack命令。如果失败,请确保您安装了,并最终通过简单地杀死它来重新启动pulseaudio 。不用担心,无需重新启动pulseaudio,它会自动重生。)。另请确保音量不为 0%,并且通道未静音:\npactl load-module module-jack-sinkpulseaudio-module-jackkillall pulseaudio在此输入图像描述
  2. \n
  3. link application -> pulseaudio:检查您的应用程序是否正在该接收器上写入。如果没有,您可以手动更改接收器(但启动脚本应该自动更改接收器):\n在此输入图像描述
  4. \n
  5. 链接jack -> sound card: 如果您仍然遇到问题(这部分也可能涉及到直接在 jack 上写入的软件的问题,例如zynaddsubfx),请查看Graphjack 的部分:
  6. \n
\n

在此输入图像描述

\n

您应该开始将所有节点打包在一起,但您可以移动它们以使它们更容易看到。然后确保您想要收听的所有应用程序都已连接system(在我的情况下zynaddsubfx没有自动连接)。注意:如果您有旧版本的 QJackctl,那么您可能有选项卡而不是这个。但它是相同的:“Jack”选项卡中的绿色输入/输出可以手动连接,紫色的输入/输出将位于“Alsa”选项卡中,红色的输入/输出位于“MIDI”选项卡中。 ..但事实上,您插入的所有外部 MIDI 设备都会出现在 Alsa 选项卡中:原因是有两种“MIDI”:传统的 Alsa Midi(端口对于系统而言是全局的)和更新的 Jack Midi(每个应用程序都可以有自己的 MIDI 输入/输出)。

\n

在此输入图像描述

\n
    \n
  1. MIDI 的麻烦:理论上,要获得 MIDI,您只需将紫罗兰色输入连接到紫罗兰色输入(或在旧版本的 Alsa 选项卡中,是的,我知道这很奇怪,您需要进入 Alsa 选项卡而不是Midi 获得 Midi(!!!),但这是因为 Alsa MIDI 与更新但较少使用的 Jack Midi 之间的差异。然而,事实证明,由于一些奇怪的原因,zynaddsubfx它有一些奇怪的默认值,并且会显示为“Midi/red”而不是“Alsa/green”,导致无法连接到外部 midi 设备。更准确地说,如果您zynaddsubfx在没有任何选项的情况下从命令行运行或使用以下命令运行:
  2. \n
\n
zynaddsubfx -I alsa -O jack\n
Run Code Online (Sandbox Code Playgroud)\n

(这意味着从 Alsa MIDI 输入,输出到插孔)应该不是问题,您将能够连接 MIDI 设备:

\n

在此输入图像描述

\n

但是,如果您以图形方式运行它,默认的 Jack 条目会自动运行zynaddsubfx -I jack -O jack...并且会出现这样的问题:输入zynaddsubfx将在红色/MIDI 选项卡中创建,而实际的外部 MIDI 设备在紫色/Alsa 中标签。因此,这意味着您将无法将外部 MIDI 键盘映射到zynaddsubfx

\n

在此输入图像描述

\n

因此,解决方案是zynaddsubfx使用不带选项的命令行运行,或者使用命令行,zynaddsubfx -I alsa -O midi一切都应该正常!

\n