Xubuntu 22.04 - 想要一个简单的脚本来记住会话之间的音量

Xubuntu 22.04 - 想要一个简单的脚本来记住会话之间的音量

这与之前的问题类似:- https://www.reddit.com/r/Ubuntu/comments/bk5czo/audio_volume_levels_not_remembered_after_reboot/

但我不想尝试该解决方案,因为它看起来像是将其修复为错误或设置错误,并且没有全面解释。

==

我的音频是家庭影院,很容易造成听力损伤和/或耳鸣。考虑到非常可预见的安全风险,我不喜欢我的操作系统根本能够在会话之间忘记音量,但我通过将硬件音量调得很低并使用 systemd 服务和 shell 脚本在启动时将软件音量设置为 50% 来做到这一点。其中唯一的命令是:-

pactl 设置接收器体积 @DEFAULT_SINK@ 50%

我想要改进这一点,方法是制作一个简单的关机脚本,将“最后一个好”音量写入文本文件,然后更改我的启动脚本以将音量设置为最后一个好音量。我可能可以自己想出如何添加一些其他逻辑,例如,检查它是否低于 50%。

答案1

从其他帖子看来,情况比 sink-volume 已经是系统范围的变量要复杂得多。但我确实找到了这个命令将当前音量写入文件:-

[NAME] 是我的用户特定的路径

pacmd 列表接收器 | grep -A 15'* index'| awk'/volume:front/{ print $5 }'| sed's/[%|,]//g'> /home/[NAME]/lastvolume.txt

所以我可以做 4 件事:启动脚本、启动服务、关闭脚本、关闭服务。

1.关机脚本-checkvolume.sh

#!/bin/bash
pacmd list-sinks|grep -A 15 '* index'| awk '/volume: front/{ print $5 }' | sed 's/[%|,]//g' > /home/[NAME]/lastvolume.txt
exit 0

2. 关闭服务 - checkvolume.service

[Unit]
Description=Records the last volume on logout, reboot, or shutdown

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/[NAME]/checkvolume.sh

[Install]
WantedBy=multi-user.target

3.启动脚本-volume.sh

#!/bin/bash
vol=$(cat /home/[NAME]/lastvolume.txt)
pactl set-sink-volume @DEFAULT_SINK@ $vol%
exit 0

4.启动服务-volume.service

[Unit]
Description=to set the volume to 50% on startup

[Service]
ExecStart=/home/[NAME]/volume.sh start

[Install]
WantedBy=multi-user.target

必须使用 chmod +x 命令使这两个脚本可执行

我必须保存到 /etc/systemd/system 中的两个服务文件

它们必须以 .service 结尾

我必须使用此命令启用每一个

sudo systemctl enable checkvolume.service

sudo systemctl enable 卷.服务

==

尽管脚本在会话期间按预期工作,但在启动时文件 lastvolume.txt 会被覆盖为空白,并且音量会重置为 100。

因此,似乎在关机期间,我的 pulseaudio 将音量设置为零值。然后我的脚本用空值覆盖文件内的数字。然后在启动时,要么我的脚本无法将值设置为零,因此它变为 100,要么我的 pulseaudio 在脚本运行后将其重置为 100。

然后我禁用了这两项服务

sudo systemctl disable checkvolume.service

sudo systemctl disable volume.service

而是进入 UI 中的“应用程序”>“设置”>“会话和启动”,并在此处创建两个指向脚本的新条目

这似乎对启动脚本有效,但对关机脚本无效。关机时,存储变量的 lastvolume.txt 文件不会被覆盖为空白,也不会被最后一个正常卷覆盖。

我猜想与 systemd 服务相比,此处放置的脚本可能在 PC 的启动和关闭序列的不同点运行。对于我这个非高级用户来说,这有点不透明,我担心整个界面可能在我的 PC 上遗留了早期版本的操作系统。

我将继续尝试让关机脚本正确运行。如果这个脚本可以在 pulseaudio(或者可能是 alsa?)将音量重置为零之前运行,那么我希望可以得到我想要的东西

在会话和启动界面中,我尝试在关机、注销、重启时设置关机脚本(checkvolume.sh),但这似乎不起作用

我研究了 Xfce 如何处理关机脚本,这似乎很难。我上面提到的 UI 界面要么无法正常工作,要么在与 pulseaudio 关闭相关的错误阶段(对我来说)使用关机/重置/注销钩子运行脚本。除此之外,我认为可以选择在 /usr/local/bin/xfce4-session 中创建包装器脚本,或者编辑以更改 /usr/bin/X11/xfce4-session,但提到这些方法的人恰好没有充分解释我的需求,例如包装器脚本是什么。

==

在“应用程序”>“设置”>“键盘”中,我还尝试使用“&”符号将写入 lastvolume.txt 的音量命令添加到增加和降低音量的键盘命令末尾 - 但这种方法不起作用。如果此界面不支持串联,我或许可以让音量键调用一个小脚本。

最后,我还是这么做了。我又写了两个脚本,并使用键盘接口将它们绑定到音量调高和音量调低键。我不喜欢这种方式,因为它是一种变通方法,不会记录除键盘按钮以外的音量变化,例如在软件或终端命令中所做的变化。但我几乎总是只使用键盘按钮,所以除非有人有更简洁的解决方案,否则这对我来说应该没问题。

1. 音量增加.sh

#!/bin/bash
pactl set-sink-volume @DEFAULT_SINK@ +5%
pacmd list-sinks|grep -A 15 '* index'| awk '/volume: front/{ print $5 }' | sed 's/[%|,]//g' > /home/dave/lastvolume.txt
exit 0

2. 音量降低.sh

#!/bin/bash
pactl set-sink-volume @DEFAULT_SINK@ -5%
pacmd list-sinks|grep -A 15 '* index'| awk '/volume: front/{ print $5 }' | sed 's/[%|,]//g' > /home/dave/lastvolume.txt
exit 0

相关内容