From f4c7fd23d0da4a9cc2b81b85eb5e9d5683401366 Mon Sep 17 00:00:00 2001 From: Stepanov Aleksey Date: Sun, 19 Oct 2025 20:42:21 +0500 Subject: 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`. --- swob-swayconfig | 6 ++++++ swob.sh | 23 ++++++++++++++++++++--- 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 -- cgit