diff options
Diffstat (limited to 'bin/volume')
-rwxr-xr-x | bin/volume | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/bin/volume b/bin/volume new file mode 100755 index 0000000..991fbc7 --- /dev/null +++ b/bin/volume @@ -0,0 +1,112 @@ +#!/bin/sh +set -eu + +usage() { + cat <<-'EOF' + Usage: + volume ACTION + volume -h + EOF +} + +help() { + cat <<-'EOF' + + Options: + -h, --help show this message + + ACTION one of: + - up + - down + - toggle + - rotate + + + Manage the audio output. + + + Examples: + + Increase the volume: + + $ volume up + + + Toggle mute/unmute in the current audio output: + + $ volume toggle + + + Change the audio output: + + $ volume rotate + EOF +} + +for flag in "$@"; do + case "$flag" in + --) + break + ;; + --help) + usage + help + exit + ;; + *) + ;; + esac +done + +while getopts 'h' flag; do + case "$flag" in + h) + usage + help + exit + ;; + *) + usage >&2 + exit 2 + ;; + esac +done +shift $((OPTIND - 1)) +ACTION="${1:-}" + +eval "$(assert-arg "$ACTION" 'ACTION')" + + +rotate() { + # This script assumes that at most 2 sinks exist at any time. + # When this premise is no longer true, it needs to be upgraded. + + CURRENT="$(pacmd list-sinks | grep '\* index' | cut -d: -f2 | tr -d ' ')" + OTHER="$(pacmd list-sinks | grep index | grep -v '\* index' | tail -n1 | cut -d: -f2 | tr -d ' ')" + + if [ "$CURRENT" = 0 ]; then + pacmd set-default-sink "$OTHER" + else + pacmd set-default-sink 0 + fi +} + +case "$ACTION" in + up) + pactl set-sink-volume @DEFAULT_SINK@ +10% + ;; + down) + pactl set-sink-volume @DEFAULT_SINK@ -10% + ;; + toggle) + pactl set-sink-mute @DEFAULT_SINK@ toggle + ;; + rotate) + rotate + ;; + *) + printf 'Bad ACTION: %s.\n\n' "$ACTION" >&2 + usage >&2 + exit 2 + ;; +esac |