#!/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() {
  if [ "$1" = 'off' ]; then
    amixer_quiet set Master mute
  elif [ "$1" = 'on' ]; then
    amixer_quiet set Master unmute
  else
    [ "$(get_mute)" = "on" ] && newm=off || newm=on
    amixer_quiet set Master "$newm"
  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