#!/usr/bin/env sh # change Volume in an easy and unified way direction=$1 step=${2:-5dB} # amixer channel to target amixer_quiet() { amixer -c 0 "$@" >/dev/null } amixer_noisy="amixer -c 0 " # Query amixer for the current volume get_volume() { $amixer_noisy get Master | tail -1 | awk '{print $4}' | sed 's/[^0-9]*//g' } # query amixer for mute state (off=muted) get_mute() { $amixer_noisy get Master | tail -1 | awk '{print $6}' | sed 's/[^a-z]*//g' } set_volume() { # Change the volume using alsa(might differ if you use pulseaudio) amixer_quiet set Master "$@" >/dev/null # Play the volume changed sound # -- this is *extremely* laggy (>8s) on my system, no idea why and no time to find out # canberra-gtk-play -i audio-volume-change -d "changeVolume" } # set mute state (off=mute) set_mute() { [ "$(get_mute)" = "on" ] && toggleto=off || toggleto=on if [ "$1" = 'off' ]; then amixer_quiet set Master mute elif [ "$1" = 'on' ]; then amixer_quiet set Master unmute # the following is needed, see https://superuser.com/questions/805525/why-is-unmute-not-working-with-amixer-command amixer_quiet set Speaker unmute amixer_quiet set Headphone unmute else amixer_quiet set Master "$toggleto" amixer_quiet set Speaker "$toggleto" amixer_quiet set Headphone "$toggleto" fi } usage() { echo "control-volume up|down [step], with step any int value or: control-brightness set [target], with target any int value 0-100" } send_notification() { if type dunstify 1>/dev/null 2>/dev/null; then notcmd="dunstify -h string:x-dunst-stack-tag:brightness" else notcmd="notify-send -h string:x-dunst-stack-tag:brightness" fi vol="$(get_volume)" if [ "$vol" -eq 0 ] || [ "$(get_mute)" = "off" ]; then # Show the sound muted notification $notcmd -a "changeVolume" -u low -i audio-volume-muted "Volume muted" else # Show the volume notification $notcmd -a "changeVolume" -u low -i audio-volume-high \ -h int:value:"$vol" "Volume: $vol%" fi } case $direction in up) set_volume "${step}+" ;; down) set_volume "${step}-" ;; mute) set_mute "$step" ;; mutetoggle) set_mute ;; set) if [ -z "$step" ]; then echo "set option requires target brightness to be specified." return 1 fi set_volume "$step" ;; *) usage ;; esac send_notification