#!/bin/sh

dbus_service="org.dsb.dsbmixer"
dbus_path="/"
dbus_interface="org.dsb.dsbmixer"

callDBusSend() {
  local method=$1
  shift
  dbus-send --type=method_call --dest=${dbus_service} \
    ${dbus_path} ${dbus_interface}.${method} $*
}

setVol() {
  callDBusSend setVol uint32:$1 uint32:$2
}

incVol() {
  callDBusSend incVol uint32:$1
}

decVol() {
  callDBusSend decVol uint32:$1
}

mute() {
  if [ "$1" != "true" -a "$1" != "false" ]; then
    echo "Value must be either 'true' or 'false'" >&2
    exit 1
  fi
  callDBusSend mute boolean:$1
}

toggleMute() {
  callDBusSend toggleMute
}

toggleAppsWin() {
  callDBusSend toggleAppsWin
}

checkArgs() {
  local command=$1
  local required=$2
  local given=$3
  [ ${given} -ge ${required} ] && return
  echo "Command ${command} requires ${required} arguments," \
       "but only ${given} where given." >&2
  exit 1
}

usage() {
  local name="$(basename $0)"
  echo "Usage: ${name} [command args ...]"
  echo "${name} incVol <amount>"
  echo "${name} decVol <amount>"
  echo "${name} mute <true|false>"
  echo "${name} toggleMute"
  echo "${name} toggleAppsWin"
  exit 1
}

[ $# -eq 0 ] && usage

while [ $# -gt 0 ]; do
  case "$1" in
  setVol)
    shift
    checkArgs setVol 2 $#
    setVol $*
    shift
    ;;
  incVol)
    shift
    checkArgs incVol 1 $#
    incVol $*
    ;;
  decVol)
    shift
    checkArgs decVol 1 $#
    decVol $*
    ;;
  mute)
    shift
    checkArgs mute 1 $#
    mute $*
    ;;
  toggleMute)
    toggleMute
    ;;
  toggleAppsWin)
    toggleAppsWin
    ;;
  *)
    usage
  esac
  shift
done

