Skip to content

Instantly share code, notes, and snippets.

@rxx
Last active December 22, 2015 19:49
Show Gist options
  • Save rxx/6521969 to your computer and use it in GitHub Desktop.
Save rxx/6521969 to your computer and use it in GitHub Desktop.

Pulseaudio: setting volume from command line. From here http://blog.waan.name/pulseaudio-setting-volume-from-command-line/

Put into pulse-volume file and make it executeable.

Increase volume by $VOL_STEP ./pulse-volume plus

Decrease volume by $VOL_STEP ./pulse-volume minus

./pulse-volume mute

Get fancy volume bar ./pulse-volume get

#!/bin/bash
 
# CHANGES, RE-VIEWS/WRITES, IMPROVEMENTS:
# mhasko: functions; VOL-steps; 
# gashapon: autodectect default sink
# konrad: more reliable way to autodetect default sink
 
# 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