Skip to content

Instantly share code, notes, and snippets.

@numberoverzero
Last active August 29, 2015 14:01
Show Gist options
  • Select an option

  • Save numberoverzero/31df3ef9f8cace74d9f3 to your computer and use it in GitHub Desktop.

Select an option

Save numberoverzero/31df3ef9f8cace74d9f3 to your computer and use it in GitHub Desktop.
Control pulseaudio volume
#!/bin/bash
#=================
# commands:
# volume : get volume
# volume [0,100] : set volume, unmute
# volume [up|down] : step volume up or down by small pct, unmute
# volume mute : toggle mute
# volume muted : exit 0/print true if muted, else exit 0/print false
#=================
SINK_NAME=$(pacmd dump | mawk '/set-default-sink/ {print $2}')
MUTED=$(pacmd dump | mawk '/set-sink-mute/ {print $3}')
# Everything in decimal
VOL_MAX=$((16#10000))
VOL_MIN=$((16#00000))
VOL_STEP=5
function constrain() {
v=$1
v=$(($v<$2?$2:$v))
v=$(($v>$3?$3:$v))
echo $v
}
function to_pct() {
echo "scale=2;100 * ($(($1)) - $VOL_MIN) / ($VOL_MAX - $VOL_MIN) + 0.5;scale=0;last/1" | bc | sed -n 2p
}
function from_pct() {
echo "scale=2;$1 * ($VOL_MAX - $VOL_MIN) / 100 + $VOL_MIN + 0.5;scale=0;last/1" | bc | sed -n 2p
}
function set() {
if [ $MUTED = yes ]; then
mute
fi
VOL_NEW=$(from_pct $1)
pactl set-sink-volume $SINK_NAME $(printf "0x%X" $VOL_NEW)
get
}
function get() {
VOL_NOW=$(($(pacmd dump | mawk '/set-sink-volume/ {print $3}')))
echo $(to_pct $VOL_NOW)
}
function up() {
set $(( $(get) + VOL_STEP))
}
function down() {
set $(( $(get) - VOL_STEP))
}
function mute() {
if [ $MUTED = yes ]; then
pactl set-sink-mute $SINK_NAME 0
else
pactl set-sink-mute $SINK_NAME 1
get
fi
}
function muted() {
if [ $MUTED = yes ]; then
echo true
true
else
echo false
false
fi
}
case "$1" in
up) up;;
down) down;;
mute) mute;;
muted) muted;;
"") get;;
*)
if [ "$1" -eq "$1" ] 2>/dev/null; then
set $1
else
echo Invalid value [0,100]
exit 1
fi
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment