使用普通 ALSA 可以在alsa-restore.service
系统重新启动后恢复声卡状态(音量、静音开关等)。
我感兴趣的是如何使用 PipeWire/WirePlumber 实现相同的目标。由于某种原因,重新启动后我的耳机输出被静音,并且其他一些设置被重置为某些默认状态。
alsa-restore.service
不起作用,因为 PipeWire/WirePlumber 在启动时会覆盖设置。
WirePlumber Lua 配置非常复杂,我无法理解它。我正在寻求帮助。
答案1
通常,在具有图形桌面用户界面的 Linux 系统上,显示的第一个程序是欢迎程序,它呈现登录屏幕。该欢迎程序在 systemd 用户上下文中执行,这会触发为所有用户定义的用户单元(服务)的启动。其中一个单元是 Pipewire,它会触发 WirePlumber 的启动。
当 WirePlumber 启动时,它默认执行的第一件事之一是恢复以前存储的路由,这些路由是按用户存储的,包括卷配置。如果失败,WirePlumber 会将接收器的音量设置为默认值 40%,将源设置为 100%。
因此,如果您的欢迎程序不支持 WirePlumber,它可以在每次显示登录屏幕时重置卷,这是 WirePlumber 实例在登录时为实际用户拾取的更改,覆盖任何以前存储的卷。
如果没有进一步的环境信息,很难说这个特定问题是否影响您,但这似乎是一个常见问题,但很难解决,所以我认为这是一个值得探索的可能性。就我而言,LightDM 就发生过这种情况。Debian Wiki 有一个关于 PipeWire 的部分专门讨论 SDDM 的这个问题。
鉴于迎宾员通常不需要播放音频,我的首选解决方案是完全禁用 PipeWire 为迎宾员用户帐户运行。为此,请在终端上运行以下命令:
- 登录到greeter 用户的systemd 会话:
sudo machinectl shell lightdm@ /bin/sh
。替换lightdm
为运行欢迎程序的用户。 - 停止 PipeWire 和 WirePlumber:
systemctl --user stop pipewire.service pipewire.socket wireplumber.service wireplumber.socket
- 禁用 PipeWire 和 WirePlumber:
systemctl --user disable pipewire.service pipewire.socket wireplumber.service wireplumber.socket
- 作为额外的安全网,屏蔽 PipeWire 和 WirePlumber:
systemctl --user mask pipewire.service pipewire.socket wireplumber.service wireplumber.socket
- 如果一切顺利,
systemctl --user status wireplumber.service
应该报告 WirePlumber 单元处于非活动状态并被屏蔽,即使您重复步骤 1,它也不会再次启动。从此时开始,只有实际用户登录才会导致 WirePlumber 启动。