aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Stepanov Aleksey <blueingreen@bluig.space>2025-10-19 20:42:21 +0500
committerLibravatar Stepanov Aleksey <blueingreen@bluig.space>2025-10-19 20:42:21 +0500
commitf4c7fd23d0da4a9cc2b81b85eb5e9d5683401366 (patch)
tree6c8195c921cd9510b28660ef3a0c10fb734a8d95
parent777b1b931e057bac216ecfe05223893a9b7444a8 (diff)
Allow a user to configure limit maximum volume output.
To do this, you need to set the `SWOB_MAX_VOLUME` variable as a percentage, for example, `SWOB_MAX_VOLUME=120`.
-rw-r--r--swob-swayconfig6
-rwxr-xr-xswob.sh23
2 files changed, 26 insertions, 3 deletions
diff --git a/swob-swayconfig b/swob-swayconfig
index b74c114..fd0d7a8 100644
--- a/swob-swayconfig
+++ b/swob-swayconfig
@@ -4,3 +4,9 @@ bindsym --locked XF86MonBrightnessUp exec exec swob.sh brightness 5%+
bindsym --locked XF86AudioLowerVolume exec exec swob.sh volume 5%-
bindsym --locked XF86AudioRaiseVolume exec exec swob.sh volume 5%+
bindsym --locked XF86AudioMute exec exec swob.sh volume toggle
+
+# or with SWOB_MAX_VOLUME
+set $SWOB_MAX_VOLUME 120
+
+bindsym --locked XF86AudioLowerVolume exec exec env SWOB_MAX_VOLUME=$SWOB_MAX_VOLUME swob.sh volume 5%-
+bindsym --locked XF86AudioRaiseVolume exec exec env SWOB_MAX_VOLUME=$SWOB_MAX_VOLUME swob.sh volume 5%+
diff --git a/swob.sh b/swob.sh
index f8f5d92..d47e980 100755
--- a/swob.sh
+++ b/swob.sh
@@ -12,7 +12,7 @@ set ${BASH_VERSION:+-o pipefail} -efu
# this is less likely.
wobdir=$XDG_RUNTIME_DIR/swob.$WAYLAND_DISPLAY
-wobfifo=$wobdir/pipe wobini= SWOB_AUDIO=
+wobfifo=$wobdir/pipe wobini= SWOB_AUDIO= SWOB_MAX_VOLUME=${SWOB_MAX_VOLUME:-100}
scan_confdirs() {
for dir in ${XDG_CONFIG_HOME:+"$XDG_CONFIG_HOME"} ~/.config /etc "${0%/*}"/../etc; do
@@ -95,6 +95,14 @@ get_audio_type() {
SWOB_AUDIO=alsa # default to ALSA
}
+pactl_vol() {
+ pactl set-sink-"$1" @DEFAULT_SINK@ "$(echo "$2" | sed -E 's/(.*)([+-])$/\2\1/')"
+}
+
+percent_to_float() {
+ awk -v percent="$1" 'BEGIN{printf "%.1f", percent/100}'
+}
+
set_vol() {
set +fu
get_audio_type
@@ -104,7 +112,7 @@ set_vol() {
pipewire)
case $1 in
toggle) to_set=mute ;;
- *) to_set='volume -l 1.0' ;;
+ *) to_set="volume -l $(percent_to_float "$SWOB_MAX_VOLUME")" ;;
esac
wpctl set-$to_set @DEFAULT_AUDIO_SINK@ "$1"
wpctl get-volume @DEFAULT_AUDIO_SINK@ | sed -E \
@@ -117,8 +125,17 @@ set_vol() {
toggle) to_set=mute ;;
*) to_set=volume ;;
esac
- pactl set-sink-$to_set @DEFAULT_SINK@ "$(echo "$1" | sed -E 's/(.*)([+-])$/\2\1/')"
+ sign="${1:(-1)}"
percent=`pactl get-sink-volume @DEFAULT_SINK@ | sed -En 's/.* ([0-9]+)%.*/\1/p'`
+
+ if test "$to_set" = "mute" \
+ -o \( "$percent" -lt "$SWOB_MAX_VOLUME" \) \
+ -o \( "$percent" -eq "$SWOB_MAX_VOLUME" -a "$sign" = "-" \); then
+ pactl_vol "$to_set" "$1"
+ else
+ pactl set-sink-$to_set @DEFAULT_SINK@ "${SWOB_MAX_VOLUME}%"
+ fi
+
mute_cmd='pactl get-sink-mute @DEFAULT_SINK@'
mute_out=`$mute_cmd`
case $mute_out in