#!/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')" 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) pacmd set-default-sink "$( pacmd list-sinks | grep index | grep -v 'index: 0$' | awk ' { n = $(NF) sinks[i++] = n last = n if ($1 == "*") { curr = n } } END { print curr == last ? sinks[0] : sinks[i - 1] }' )" ;; *) printf 'Bad ACTION: %s.\n\n' "$ACTION" >&2 usage >&2 exit 2 ;; esac