#!/bin/bash
# Skrypt do kontrolowania głośności urządzenia

# Poniższe zmienne dopasuj do własnych wymagań
DEFAULT_INTERVAL=5
DEFAULT_MIXER=Master

VIEWER='qiv -p'
IMAGE_ON="$HOME/skrypty/.glosniki/glosnik.png"
IMAGE_OFF="$HOME/skrypty/.glosniki/glosnik-wyl.png"
# polecenie nie zawiera argumentu opcji -P, ponieważ
# zostanie on obliczony w trakcie działania skryptu i wpisany tak,
# aby odpowiadał stanowi aktualnemu
OSD="osd_cat -p middle -A center -b percentage -T Głośność -d 1 -f '-*-helvetica-*-r-*-*-34-*-*-*-*-*-*-*' -O 1 -c '#fff' -P"

# nie modyfikuj nic poniżej chyba że wiesz co robisz

function help_msg {
	echo "$0 [rise|lower|toggle]"
	echo "If you need more advanced options, use amixer."
}

function get_volume {
	amixer get $DEFAULT_MIXER |tail -1 |perl -pe 's:.*?\[([0-9]+)%.*:$1:gi'
}

function set_state {
	amixer -q set $DEFAULT_MIXER "$1"
}

function display_image {
	case $(amixer get $DEFAULT_MIXER |tail -1 |cut -d'[' -f 4) in
		"on]") IMAGE=$IMAGE_ON ;;
		"off]") IMAGE=$IMAGE_OFF ;;
	esac
	
	$VIEWER $IMAGE &
	local PID=$!
	sleep 1
	kill $PID
}

# taka proteza troche utrudniająca przypadkowe zamknięcie qiv lub osd_cat
# jeśli ktoś ich używa poza skryptem. Jeśli któreś z nich zostało uruchomione
# na trzy sekundy lub mniej przed chwilą obecną, zamyka je.
# Zapobiega to nachodzeniu obrazów lub OSD na siebie w przypadku szybkiego
# wywoływania skryptu
function kill_process {
	pgrep "$1" | while read PID; do
		NOW=$(date +%s)
		PID_C_TIME=$(stat --printf "%Y\n" /proc/$PID)
		if [ $PID_C_TIME -gt $((NOW-3)) ]; then
			kill $PID
		fi
	done
}

function cleanup {
	kill_process osd_cat
	kill_process qiv
}

if [ x$1 == 'x-h' ] || [ x$1 == 'x--help' ] || [ -z $1 ]; then
	help_msg
	exit 0
fi

if [ ! -z "$2" ]; then
	DEFAULT_INTERVAL=$2
fi

case $1 in
	'rise')
		cleanup
		set_state $DEFAULT_INTERVAL+
		eval $OSD $(get_volume)
		;;
	'lower')
		cleanup
		set_state $DEFAULT_INTERVAL-
		eval $OSD $(get_volume)
		;;
	'toggle')
		cleanup
		set_state toggle
		display_image
		;;
	*)
		help_msg
		exit 1
		;;
esac
