有没有办法通过终端控制 JACK 输出音量或获取 PulseAudio 输入?

有没有办法通过终端控制 JACK 输出音量或获取 PulseAudio 输入?

我有一个具体的问题:

作为一名音乐家,我使用 Ubuntu 进行软件监控,并且我想用鼠标滚轮控制输出主音量。

为此,我目前使用 EasyStroke 的命令amixer -D pulse sset Master 5%+(鼠标滚轮向上)和amixer -D pulse sset Master 5%-(鼠标滚轮向下),效果很好。

问题是我使用了一些具有直接 JACK 输出的程序,例如 Reaper、我的 DAW 以及一些媒体播放器。

只要软件使用 PulseAudio JACK Sink 输出,我就可以通过鼠标滚轮控制输出音量,但是当软件不使用 PulseAudio 时,它会直接连接到 JACK 并且始终处于最大音量。

如果您参考屏幕截图:我可以操纵红色标记输出(PulseAudio JACK Sink)的主音量,但我实际上需要访问标记为绿色的输出来控制所有声音(系统输出)。

不幸的是,我无法通过 控制我的 ALSA 主音量amixer -q sset Master X,因为 ALSA 没有为我的唯一的 USB 声卡提供任何控制。

有没有什么方法可以通过终端控制 JACK 输出音量,我可以用它代替鼠标按钮命令?

或者,有没有办法在 JACK 连接的右侧添加一个 PulseAudio 输入模块来连接 Reaper 和所有其他 JACK 软件并通过 PulseAudio JACK Sink 进行路由?(PulseAudio JACK Source 仅用于麦克风,不会播放输入。)

在此处输入图片描述

答案1

2019 年 7 月 21 日更新

来自 Linux 的专业音乐网站:

抱歉,我发了一个不太热情的问题,但我需要你的指导。当 Jack 控制音频时,许多应用程序(包括 flashplayer)的声音会非常大,例如在 VLC 中我将音量设置为 5%。我想像在 alsamixer 中一样控制主音量,而不是为每个应用程序单独设置音量。我该怎么做?

已发布两个答案,其中最有帮助的是:

没有这样的概念。JACK 是为专业音频和音乐创作工作流程而设计的。它不是桌面声音服务器,尽管有些人以那种方式使用它。如果您需要这样的东西,您将需要通过混音客户端路由所有 JACK 客户端,该客户端可以是像 JackMix 一样简单的客户端,也可以是像 Ardour 一样复杂的客户端。JACK 本身不提供此功能,这完全超出了其设计范围。

最简单的解决方案是安装杰克·米克斯

“您是否曾经为桌面上的多个插孔应用程序而苦恼,每个应用程序都使用自己的主音量推子,但没有一个可以直接访问所有音量的公共位置?”

“解决您问题的方法是 JackMix,这是一款用于杰克的混音器应用程序,它看起来与您连接模拟设备时使用的混音器完全一样。”

还有其他应用杰克您可以找到以下列表这里


原始答案

我必须承认我在音乐方面不太擅长,但我认为这个脚本是您要去的地方:

您可以使用 pacmd set-sink-volume 获取所有接收器的列表pacmd list-sinks, and set the volume with,因此您需要执行类似以下操作

VOLUME='+5%'
for SINK in `pacmd list-sinks | grep 'index:' | cut -b12-`
do
  pacmd set-sink-volume $SINK $VOLUME
done

其中$VOLUME可以是绝对值(150%)或相对值(+5%,-5%),也可能是其他格式。

大多数窗口管理器都可以配置为在您按下键时启动带有参数的脚本或程序。这是最好的方法,但如果您的窗口管理器没有,可以使用 之类的工具xbindkeys。因此,您可以按照自己想要的任何方式进行自定义。

请注意,如果接收器音量超过 100%,Pulseaudio 将开始使用硬件混音器,这可能会导致声音失真。

另请注意,Pulseaudio 允许使用 pamcd set-sink-input-volume 设置每个应用程序(“音频流”)的音量。您可以使用 pacmd list-sink-inputs 列出它们,并以类似的方式设置它们。

这样,您可以将接收器音量保持在固定水平,使它们大致相等,而无需使用硬件混合器,并且当您切换接收器时,它将自动具有“正确”的音量。这是我更喜欢的设置。

答案2

基于例如我们就可以解决这个问题。

如果您的声卡无法在硬件端控制音量,或者驱动程序不支持您的声卡的此功能,则一个可能的解决方法是在文件中定义一个新的虚拟 pcm 设备~/.asoundrc,该设备控制软件端的音量。

首先我们需要知道声卡的名称,因此

 aplay -L

是此处有用的命令。实际卡名称将显示在后面CARD=,设备名称(编号)将显示在后面DEV=

我们可以使用以下方法测试设备

speaker-test -D <card name> -c <channel count> -twav

softvol现在我们通过添加来创建新设备

pcm.softvol {
    type            softvol
    slave {
    pcm         "<card name>,<device name>"
    }
    control {
        name        "<control name>"
        card        "<card name>"
    }
}

~/.asoundrc。(如果文件不存在,我们必须创建该文件)

在这种情况下应该是Master,请参阅上面链接中有关控件名称的其他信息。

现在我们测试新设备

speaker-test -D softvol -c <channel count> -twav

打开 alsamixer,您现在应该可以看到新的控件Master,并且能够使用 alsamixer 来改变音量。

可能还需要使用以下命令将设备设置为默认设备/etc/asound.conf

pcm.!default {
    type   hw
    card   <card name>
}
ctl.!default {
    type   hw
    card   <card name>
}

请注意,这与上面链接中的建议不同,但这就是 OP 报告的工作方式。

现在我们需要将 Jack 接口设备设置为,softvol然后就可以使用例如

amixer -q sset Master 5%+
amixer -q sset Master 5%-
amixer -q sset Master 50%

分别增加或减少输出音量5%或设置为50%,固定。

speaker-test -D softvol -c <channel count> -twavAmixer 需要先“打开”设备,然后才能访问主音量命令。使用while jackdis开始声音测试不是运行,然后使用它sudo alsactl store来保存主音量状态。否则,每次重启后都必须播放声音softvol才能使音量控制正常工作。

答案3

更新 1

这样我就可以先简单解释一下,然后再写较长的内容。

即使 PCM 不可用(不仅仅是在 amixer 中不可见),我们仍然可以使用 PulseAudio 来管理 JACK,因为 dbus 会发现它。

首先,请确保您已经为 USB 声卡加载了内核模块:

sudo modprobe snd-usb-audio

因为这可能是声卡控件未显示在 amixer 中的原因。为了确认,请执行aplay -laplay -L发布这两个命令的输出。

接下来,我们开始安装相应的 pulseaudio 包:

sudo apt-get update && sudo apt-get install pulseaudio-module-jack

然后加载其相应的模块:

pactl load-module module-jack-sink channels=2

最后将默认接收器设置为 JACK

pacmd set-default-sink jack_out


就 而言sudo pactl load-module module-alsa-sink control=PCM,此行使 pulseaudio 能够创建一个新的接收源,用于在 ALSA API 声卡级别处理脉冲编码调制音量级别。OP 的声卡必须能够通过脉冲调制将数字音频流转换为模拟音频流,因为有音频从系统传出并通过扬声器传出。


您应该首先添加一个控制 pcm 设备的接收器作为输出:

sudo pactl load-module module-alsa-sink control=PCM

pavucontrol然后(只需再检查一下,看看是否可以通过ie pulseaudio 音量控制 GUI看到新的输出)

你可以直接使用以下命令控制 PCM 接收器输出音量

pactl set-sink-volume [pcm-sink-name likely something along the lines of alsa.default] 50%

相关内容