Autorandr 但适用于音频设备?

Autorandr 但适用于音频设备?

我的 ThinkPad T450s 运行 Manjaro。作为一名 Scrum Master,我经常在有两个外部显示器的办公桌、没有显示器的会议室和有一个外部显示器的会议室之间移动。我已经安装了autorandr笔记本电脑,以便根据可用的硬件自动设置我的工作区。我太喜欢了!

但我也喜欢类似的音频解决方案。在办公桌前时,我希望“输入的后备设备是我的蓝牙 Jabra 耳机,输出的后备设备是我的“同时输出到所有设备”的伪设备,但在会议室中,我通常会连接 USB(Jabra 或Logitech)会议室扬声器设备 - 然后我需要进入音量控制面板并设置默认设备。

如果我能让整个事情自动化的话新连接的设备将被自动选择作为后备输入/输出,那就太好了!

警告:要赢得赏金,答案必须描述有效的解决方案自动地当硬件插入/拔出时。每当运行时触发脚本运行是可以接受的autorandr(但autorandr它本身没有这样的滑流功能)。

音量控制面板

编辑:受@telcoM的回答的启发,我现在可以包含我的系统识别的源和接收器的列表(除了我当前未连接到的会议室中的源和接收器):

$ pactl list | grep -B 2 'ame:' | grep -A 2 'Sink #'
Sink #0
    State: SUSPENDED
    Name: alsa_output.pci-0000_00_1b.0.analog-stereo
--
Sink #1
    State: SUSPENDED
    Name: combined
--
Sink #43
    State: SUSPENDED
    Name: alsa_output.usb-GN_Netcom_A_S_Jabra_PRO_9470_026D0D98A805-00.analog-mono
--
Sink #93
    State: SUSPENDED
    Name: alsa_output.pci-0000_00_03.0.hdmi-stereo-extra1

并且

$ pactl list | grep -B 2 'ame:' | grep -A 2 'Source #'
Source #0
    State: SUSPENDED
    Name: alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
--
Source #1
    State: SUSPENDED
    Name: alsa_input.pci-0000_00_1b.0.analog-stereo
--
Source #2
    State: SUSPENDED
    Name: combined.monitor
--
Source #46
    State: SUSPENDED
    Name: alsa_output.usb-GN_Netcom_A_S_Jabra_PRO_9470_026D0D98A805-00.analog-mono.monitor
--
Source #47
    State: SUSPENDED
    Name: alsa_input.usb-GN_Netcom_A_S_Jabra_PRO_9470_026D0D98A805-00.analog-mono
--
Source #97
    State: SUSPENDED
    Name: alsa_output.pci-0000_00_03.0.hdmi-stereo-extra1.monitor

答案1

默认情况下,Pulseaudio 会记住每个播放源与哪个输出设备关联,对于输入设备和录音软件也是如此。这是原版 Pulseaudio 设备关联的主要来源。

仅当例如播放源没有先前关联的记录,或者先前关联的设备不再可用时,才使用回退设备。

至少 KDE 有一个多媒体设置对话框,您可以使用它为音频输入/输出设备分别设置每种类型的音频输入/输出(例如,通信与音频或视频播放/录制)的优先级顺序。这似乎改变了 Pulseaudio 的行为。

这个博客和提到的paswitch实用程序可能对您有用:

https://www.tablix.org/~avian/blog/archives/2012/06/switching_pulseaudio_output_device/

Git 存储库paswitchhttps://www.tablix.org/~avian/git/paswitch.git

我之前有一个用于此目的的脚本,但paswitch更好,因为除了切换默认/后备输出之外,它还将活动源和先前记住的源切换为新输出。不幸的是它只处理输出侧。

要切换已经开始使用特定麦克风的活动客户端,您需要执行以下操作:

pacmd set-default-source "$SOURCEID"
if ! pacmd list-source-outputs | head -1 | grep -q "^0 source output"
then
    # active input clients, switch them to new mic
    for idx in $(pacmd list-source-outputs | awk '/index:/{print $2;}')
    do
        # sources include monitor sources that cannot be moved
        pacmd move-source-output $idx $SOURCEID >/dev/null
    done
fi

这首先将默认麦克风更改为 中指定的麦克风$SOURCEID,然后将所有活动的应用程序移至该新麦克风。

但是,如果应用程序在使用不同的音频源设备之前运行,并且该源在系统上仍然可用,则 Pulseaudio 默认情况下会将其连接到旧源而不是新的默认源,除非其持久性功能已关闭。

答案2

噢!我找到了获取输入和输出名称的正确命令!这主要来自这是对另一个问题的回答,但真正值得赞扬的是你telcoM为我指明了方向pactl

$ pactl list short sources
0   alsa_output.pci-0000_00_1b.0.analog-stereo.monitor  module-alsa-card.c  s16le 2ch 44100Hz   RUNNING
1   alsa_input.pci-0000_00_1b.0.analog-stereo   module-alsa-card.c  s16le 2ch 44100Hz   RUNNING
2   combined.monitor    module-combine-sink.c   s16le 2ch 44100Hz   RUNNING
144 alsa_output.usb-GN_Netcom_A_S_Jabra_PRO_9470_026D0D98A805-00.analog-mono.monitor    module-alsa-card.c  s16le 1ch 16000Hz   RUNNING
145 alsa_input.usb-GN_Netcom_A_S_Jabra_PRO_9470_026D0D98A805-00.analog-mono module-alsa-card.c  s16le 1ch 16000Hz   RUNNING
152 alsa_output.pci-0000_00_03.0.hdmi-stereo-extra1.monitor module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

$ pactl list short sinks
0   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   RUNNING
1   combined    module-combine-sink.c   s16le 2ch 44100Hz   RUNNING
136 alsa_output.usb-GN_Netcom_A_S_Jabra_PRO_9470_026D0D98A805-00.analog-mono    module-alsa-card.c  s16le 1ch 16000Hz   RUNNING
143 alsa_output.pci-0000_00_03.0.hdmi-stereo-extra1 module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

这允许我设置来源:

$ pactl set-default-source alsa_input.usb-GN_Netcom_A_S_Jabra_PRO_9470_026D0D98A805-00.analog-mono
$ pactl set-default-source alsa_input.pci-0000_00_1b.0.analog-stereo

还有水槽:

$ pactl set-default-sink alsa_output.usb-GN_Netcom_A_S_Jabra_PRO_9470_026D0D98A805-00.analog-mono
$ pactl set-default-sink combined

然后,我可以将这些命令放入“钩子脚本” 来autorandr触发。我只需要在视频线之前连接 USB 音频设备,一切都会很棒!

相关内容