#!/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