#!/bin/sh

set -e

PATH=/usr/local/sbin:/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin

if [ "$(id -u)" != "0" ] && [ "$1" != "--help" ] &&
   [ "$1" != "help" ] && [ ! -z "$1" ]; then
    echo "$0: To $1 ALSA, you must be root."
    exit 1
fi

# Default settings
alsactl_store_on_shutdown="autosave always"
runlevels_save='[2-5]'

[ -e /etc/default/alsa ] && . /etc/default/alsa

case "$1" in
    start)
	printf "Restoring ALSA mixer settings ... "
	if alsactl restore > /dev/null 2>&1; then
	    echo "done."
	else
	    echo "failed:"
	    echo "       You may want to run 'alsactl restore' manually to view any errors."
	    exit 1
	fi
	;;
    stop)
	if [ "$alsactl_store_on_shutdown" != "never autosave" ]; then
	    if runlevel | grep -E "^$runlevels_save " > /dev/null 2>&1 \
	    || runlevel | grep -E " $runlevels_save\$" > /dev/null 2>&1; then
		printf "Storing ALSA mixer settings ... "
		if alsactl store > /dev/null 2>&1; then
		    sleep 1
		    echo "done."
		else
		    echo "failed"
		fi
	    fi
	fi
	;;
    force-stop|force-reload)
	procs_using_sound="$(lsof +D /dev -F rt | awk '/^p/ {pid=$1} /^t/ {type=$1} /^r0x(74|e)..$/ && type == "tCHR" {print pid}' | cut -c 2- | uniq)"
	if [ ! -z "$procs_using_sound" ]; then
	    printf "Terminating processes ... "
	    kill $procs_using_sound
	    sleep 2
	    kill -9 $procs_using_sound
	    echo "done"
	fi
	$0 stop
	rmmod=""
	case "$(modprobe --version 2>&1)" in
	    modprobe*)
		rmmod="rmmod -r"
		;;
	    module-init-tools*)
		rmmod="modprobe -r"
		;;
	esac
	printf "Unloading modules ... "
	for i in $(lsmod | awk '/^snd/ {print $1}'); do
	    $rmmod $i >/dev/null 2>&1 || :
	done
	echo "done"
	;;
    restart|reload)
	$0 stop && $0 start
	;;
    *)
	echo "Usage: /etc/init.d/alsa {start|stop|restart|reload|force-stop|force-reload}"
	exit 1
	;;
esac
