我有一台笔记本电脑,它有自己的扬声器。然后我有一台显示器(DP 通过 USB-C,立体声 2.0),它有更好的扬声器,我更喜欢在连接时使用。我还有一个便携式扬声器(蓝牙、3.5 插孔和微型 USB 连接、立体声),我在烹饪时观看/收听视频时使用。我有时也会通过 HDMI 将笔记本电脑连接到家庭影院到 AVR (5.1)。所有这些都是动态变化的,可能会同时连接三个或四个。
我想像这样设置设备的优先级:
- AVR
- 便携式扬声器
- 监视器
- 笔记本电脑
这样当我更改配置时它们会神奇地自动选择(每天可能发生几次)
现在,PulseAudio 试图挑选最好的,有时会成功,有时不会。
如果我的谷歌搜索是正确的,我无法通过配置文件或某些 GUI 设置默认值,我需要编写一个脚本。我对此感到有些惊讶——我认为这一定是一个常见的用例。所以我在尝试编写这样的脚本之前询问我的研究是否有误(或者如果有人有这样的脚本,请随时分享,我发现的唯一内容是:https ://askubuntu.com/ questions/263248/set-hdmi-sound-output-automatically-on-connect-disconnect - 这不像我的设置那么复杂)
令我困惑的另一件事是,在 Gnome、KDE 或 pactl 中的所有工具中,“DELL U4320Q”、“JieLi AC46”等设备的实际名称都被隐藏了(在 pactl 下的 card>properties>device.product .name) 并且不会在 UI 中公开。这是为什么?它们肯定会更具人类可读性。对于显示器,我通常会得到类似“dmi-output-0:HDMI / DisplayPort”的信息 - 我应该如何知道我将显示器连接到哪个端口(哪个端口是 0,哪个是 1)?有什么理由会这样吗?每次我更新我的安装时,我都很好奇是否有任何改变,但它基本上保持不变。Pipewire 会对此有所帮助吗?我认为 PulseAudio 应该使这种用法变得简单:-)。
所以最后我写了下面的脚本
/usr/local/bin/hdmi_sound_toggle.py
来为我自动切换。它使用此处提供的脚本:https ://stackoverflow.com/a/24933353/1269040找出连接了哪些监视器。为了自动运行它,我放了这个:
/etc/udev/rules.d/99-hdmi_sound.rules
跑了sudo udevadm control --reload-rules
。/usr/local/bin/run_hdmi_sound_toggle
jsut 是一个包装脚本,用于处理在 root 下运行的 udev 并且无法连接到用户运行的 Pipewire/PulseAudio:并且相应的 systemd 服务文件
~/.config/systemd/user/hdmi_sound_toggle.service
是:然后它在 DHMI/USB-C/DP 插拔上运行。
它只对通过 DP 或 HDMI 连接的设备起作用——Pipewire 似乎可以很好地处理 USB/蓝牙设备。