dotfiles/scripts/.local/bin/control-volume
Marty Oehme 5ce6111f51
scripts: Add unified volume bars to control scripts
`control-brightness` and `control-volume` both now have the exact same
progress bar indicator.
Additionally, by using the same dunst 'stack' they replace each other if
invoked in quick succession, which I really like.
2021-03-17 15:06:02 +01:00

94 lines
2.1 KiB
Bash
Executable file

#!/usr/bin/env sh
# change Volume in an easy and unified way
direction=$1
step=${2:-5dB}
# amixer channel to target
amixer_quiet() {
amixer -c 0 "$@" >/dev/null
}
amixer_noisy="amixer -c 0 "
# Query amixer for the current volume
get_volume() {
$amixer_noisy get Master | tail -1 | awk '{print $4}' | sed 's/[^0-9]*//g'
}
# query amixer for mute state (off=muted)
get_mute() {
$amixer_noisy get Master | tail -1 | awk '{print $6}' | sed 's/[^a-z]*//g'
}
set_volume() {
# Change the volume using alsa(might differ if you use pulseaudio)
amixer_quiet set Master "$@" >/dev/null
# Play the volume changed sound
# -- this is *extremely* laggy (>8s) on my system, no idea why and no time to find out
# canberra-gtk-play -i audio-volume-change -d "changeVolume"
}
# set mute state (off=mute)
set_mute() {
if [ "$1" = 'off' ]; then
amixer_quiet set Master mute
elif [ "$1" = 'on' ]; then
amixer_quiet set Master unmute
else
[ "$(get_mute)" = "on" ] && newm=off || newm=on
amixer_quiet set Master "$newm"
fi
}
usage() {
echo "control-volume up|down [step], with step any int value
or: control-brightness set [target], with target any int value 0-100"
}
send_notification() {
if type dunstify 1>/dev/null 2>/dev/null; then
notcmd="dunstify -h string:x-dunst-stack-tag:brightness"
else
notcmd="notify-send -h string:x-dunst-stack-tag:brightness"
fi
vol="$(get_volume)"
bar=$(seq -s "─" $((vol / 5)) | sed 's/[0-9]//g')
if [ "$vol" -eq 0 ] || [ "$(get_mute)" = "off" ]; then
# Show the sound muted notification
$notcmd -a "changeVolume" -u low -i audio-volume-muted "Volume muted"
else
# Show the volume notification
$notcmd -a "changeVolume" -u low -i audio-volume-high \
-h int:value:"$vol" "Volume: $vol%
$bar"
fi
}
case $direction in
up)
set_volume "${step}+"
;;
down)
set_volume "${step}-"
;;
mute)
set_mute "$step"
;;
mutetoggle)
set_mute
;;
set)
if [ -z "$step" ]; then
echo "set option requires target brightness to be specified."
return 1
fi
set_volume "$step"
;;
*)
usage
;;
esac
send_notification