Skip to content

Instantly share code, notes, and snippets.

@it-is-michal
Created November 16, 2013 13:18
Show Gist options
  • Save it-is-michal/7500094 to your computer and use it in GitHub Desktop.
Save it-is-michal/7500094 to your computer and use it in GitHub Desktop.
Pulse Audio volume controll script
#!/bin/bash
# CHANGES, RE-VIEWS/WRITES, IMPROVEMENTS:
# mhasko: functions; VOL-steps;
# gashapon: autodectect default sink
# konrad: more reliable way to autodetect default sink
# source: http://blog.waan.name/pulseaudio-setting-volume-from-command-line/
# get default sink name
SINK_NAME=$(pactl stat | grep "alsa_output" | perl -a -n -e 'print $F[2]')
# set max allowed volume; 0x10000 = 100%
VOL_MAX="0x10000"
STEPS="16" # 2^n
VOL_STEP=$((VOL_MAX / STEPS))
VOL_NOW=`pacmd dump | grep -P "^set-sink-volume $SINK_NAME\s+" | perl -p -n -e 's/.+\s(.x.+)$/$1/'`
MUTE_STATE=`pacmd dump | grep -P "^set-sink-mute $SINK_NAME\s+" | perl -p -n -e 's/.+\s(yes|no)$/$1/'`
function plus() {
VOL_NEW=$((VOL_NOW + VOL_STEP))
if [ $VOL_NEW -gt $((VOL_MAX)) ]; then
VOL_NEW=$((VOL_MAX))
fi
pactl set-sink-volume $SINK_NAME `printf "0x%X" $VOL_NEW`
}
function minus() {
VOL_NEW=$((VOL_NOW - VOL_STEP))
if [ $(($VOL_NEW)) -lt $((0x00000)) ]; then
VOL_NEW=$((0x00000))
fi
pactl set-sink-volume $SINK_NAME `printf "0x%X" $VOL_NEW`
}
function mute() {
if [ $MUTE_STATE = no ]; then
pactl set-sink-mute $SINK_NAME 1
elif [ $MUTE_STATE = yes ]; then
pactl set-sink-mute $SINK_NAME 0
fi
}
function get() {
BAR=""
if [ $MUTE_STATE = yes ]; then
BAR="mute"
ITERATOR=$((STEPS / 2 - 2))
while [ $ITERATOR -gt 0 ]; do
BAR=" ${BAR} "
ITERATOR=$((ITERATOR - 1))
done
else
DENOMINATOR=$((VOL_MAX / STEPS))
LINES=$((VOL_NOW / DENOMINATOR))
DOTS=$((STEPS - LINES))
while [ $LINES -gt 0 ]; do
BAR="${BAR}|"
LINES=$((LINES - 1))
done
while [ $DOTS -gt 0 ]; do
BAR="${BAR}."
DOTS=$((DOTS - 1))
done
fi
echo "$BAR"
}
case "$1" in
plus)
plus
;;
minus)
minus
;;
mute)
mute
;;
get)
get
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment