使用笔记本电脑扬声器时,插入耳机会自动将输出从扬声器切换到耳机,拔出时反之亦然。通过 HDMI 使用显示器扬声器时,没有自动切换:
当耳机插入(拔出)时,音频输出可以在设备之间自动切换吗?
Debian 12(书虫),内核版本 6.7.9-2,pipewire 1.0.5。
答案1
笔记本电脑扬声器和模拟耳机之间的音频自动切换是在单个音频芯片的不同输出之间进行的。该芯片甚至可以有一些硬件支持:通过 HD-Audio 风格的前面板音频插孔,它是声音芯片内的一项可切换功能,启用后,当检测到插入耳机时,会自动静音其他输出。
(如果您使用egalsamixer
并选择声音芯片的实际硬件混音器而不是Pipewire提供的简化音量控制,您可能会将其视为切换Auto-Mute
。)
对于较旧的 AC97 式前面板音频插孔,它实际上是音频插孔本身内的机械开关,当插入耳机插孔时,它将中断扬声器/线路输出的输出信号。
在 HDMI 和任何类型的耳机之间,或者在笔记本电脑扬声器和 USB 耳机之间切换时,音频数据流需要切换到不同的音频芯片。 Pipewire 可以做到这一点,但只有正确设置输出接收器优先级并启用自动切换时,它才会这样做。
看这个博客条目:它描述了如何在wireplumber
0.4系列中检查和调整音频接收器优先级,这是Debian 12所具有的。如果您有 0.5 或更高版本,此建议将不会直接适用wireplumber
,因为配置方法在版本 0.5 中已更改。
简而言之:第一步是在插入新声音设备时启用自动切换。您可以通过运行 来临时执行此操作pactl load-module module-switch-on-connect
。
这个 AskUbuntu.SE 问题还包括运行的建议pactl load-module module-switch-on-port-available
:我了解,当现有音频设备上有新端口可用时,可以进行切换。
要使上述命令持久存在,请阅读/usr/share/pipewire/pipewire-pulse.conf
示例,并将相关部分添加到目录*.conf
中的文件中~/.config/pipewire/pipewire-pulse.conf.d/
(如果不存在则创建它)。例如:
pulse.cmd = [
{ cmd = "load-module" args = "module-always-sink" flags = [ ] } #default
{ cmd = "load-module" args = "module-switch-on-connect" } #uncommented
{ cmd = "load-module" args = "module-switch-on-port-available" } #added
#{ cmd = "load-module" args = "module-gsettings" flags = [ "nofail" ] }
]
第二步是确保您的声音设备获得适当的优先级分配。
您可以用来wpctl status
查看 Pipewire 关心的任何设备的标识号,然后wpctl inspect <number> | grep -e node -e priority
查看特定音频设备的名称、描述和优先级。如果默认的优先级顺序不是您想要的,您可以创建一个~/.config/wireplumber/main.lua.d/60-*.lua
文件来调整它们,内容类似于:
rule = {
matches = {
{
{ "node.name", "equals", "alsa_output.usb-MOTU_M4_M4MC0570FU-00.Direct__hw_M4__sink" },
},
},
apply_properties = {
["priority.driver"] = 1050,
["priority.session"] = 1050,
},
}
“预期”主要声音设备的默认优先级应约为 1009,因此,通过为某些其他声音设备分配更高的值,可以使其pipewire
优先于其他可用的声音设备。但您不应分配高于 1500 的值,因为高于该值的值是为监视设备保留的。
显然各个端口也有优先级值,不幸的是我目前不知道如何自定义它们。pactl list cards
尽管输出相当长,但您可以查看它们。
如果有人知道调整 Pipewire 端口优先级的好方法,如果您不想编写自己的完整答案,请随意编辑它。