#!/usr/bin/env bash # finds the active sink for pulse audio and increments the volume. useful when you have multiple audio outputs and have a key bound to vol-up and down osd='no' inc='2' capvol='no' maxvol='100' autosync='yes' # Muted status # yes: muted # no : not muted curStatus="no" active_sink="" limit=$((100 - inc)) maxlimit=$((maxvol - inc)) reloadSink() { active_sink=$(pacmd list-sinks | awk '/* index:/{print $3}') } function volUp { getCurVol if [ "$capvol" = 'yes' ] then if [ "$curVol" -le 100 ] && [ "$curVol" -ge "$limit" ] then pactl set-sink-volume "$active_sink" -- 100% elif [ "$curVol" -lt "$limit" ] then pactl set-sink-volume "$active_sink" -- "+$inc%" fi elif [ "$curVol" -le "$maxvol" ] && [ "$curVol" -ge "$maxlimit" ] then pactl set-sink-volume "$active_sink" "$maxvol%" elif [ "$curVol" -lt "$maxlimit" ] then pactl set-sink-volume "$active_sink" "+$inc%" fi getCurVol if [ ${osd} = 'yes' ] then qdbus org.kde.kded /modules/kosd showVolume "$curVol" 0 fi if [ ${autosync} = 'yes' ] then volSync fi } function volDown { pactl set-sink-volume "$active_sink" "-$inc%" getCurVol if [ ${osd} = 'yes' ] then qdbus org.kde.kded /modules/kosd showVolume "$curVol" 0 fi if [ ${autosync} = 'yes' ] then volSync fi } function getSinkInputs { input_array=$(pacmd list-sink-inputs | grep -B 4 "sink: $1 " | awk '/index:/{print $2}') } function volSync { getSinkInputs "$active_sink" getCurVol for each in $input_array do pactl set-sink-input-volume "$each" "$curVol%" done } function getCurVol { curVol=$(pacmd list-sinks | grep -A 15 "index: $active_sink$" | grep 'volume:' | grep -E -v 'base volume:' | awk -F : '{print $3}' | grep -o -P '.{0,3}%'| sed s/.$// | tr -d ' ') } function volMute { case "$1" in mute) pactl set-sink-mute "$active_sink" 1 curVol=0 status=1 ;; unmute) pactl set-sink-mute "$active_sink" 0 getCurVol status=0 ;; esac if [ ${osd} = 'yes' ] then qdbus org.kde.kded /modules/kosd showVolume ${curVol} ${status} fi } function volMuteStatus { curStatus=$(pacmd list-sinks | grep -A 15 "index: $active_sink$" | awk '/muted/{ print $2}') } # Prints output for bar # Listens for events for fast update speed function listen { firstrun=0 pactl subscribe 2>/dev/null | { while true; do { # If this is the first time just continue # and print the current state # Otherwise wait for events # This is to prevent the module being empty until # an event occurs if [ $firstrun -eq 0 ] then firstrun=1 else read -r event || break if ! echo "$event" | grep -e "on card" -e "on sink" then # Avoid double events continue fi fi } &>/dev/null output done } } function output() { reloadSink getCurVol volMuteStatus if [ "${curStatus}" = 'yes' ] then echo "muted" else echo "$curVol%" fi } #}}} reloadSink case "$1" in --up) volUp ;; --down) volDown ;; --togmute) volMuteStatus if [ "$curStatus" = 'yes' ] then volMute unmute else volMute mute fi ;; --mute) volMute mute ;; --unmute) volMute unmute ;; --sync) volSync ;; --listen) # Listen for changes and immediately create new output for the bar # This is faster than having the script on an interval listen ;; *) # By default print output for bar output ;; esac