#! /bin/sh
# aumix(-gtk)    Save/restore mixer settings on bootup
# Original version by Leon Breedt <ljb@debian.org>
# Heavily edited by Eduard Bloch <blade@debian.org>
# Some changes (2002) by Bas Zoetekouw <bas@debian.org>
# Supports multiple devices with probing

### BEGIN INIT INFO
# Provides:          aumix
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      udev
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Restore mixer settings from saved values.
### END INIT INFO

CONF=/etc/aumixrc
AUMIX=/usr/bin/aumix
DEFAULTFILE=/etc/default/aumix
KEYFILE=/etc/default/aumix.stop

. /lib/lsb/init-functions

# Create the locking directory
[ -d /var/lock/aumix/ ] || mkdir /var/lock/aumix

[ -x $AUMIX ] || exit 0

# handle /etc/defaults/aumix stuff
SAVEMIXER="yes" # save and restore mixer setting by default
HANDLEALSA="no" # do not save and restore if ALSA detected by default

[ -f $DEFAULTFILE ] && . $DEFAULTFILE

# exit silently
[ $SAVEMIXER = "no" -o $SAVEMIXER = "NO" ] && exit 0

# backward compatibility
if [ -f $KEYFILE ] ; then
	log_warning_msg "Warning: use of $KEYFILE is obsolete."
	log_warning_msg "Edit /etc/default/aumix instead."
	log_warning_msg "Key file $KEYFILE detected, won't execute aumix."
	exit 0
fi

export PATH=/usr/sbin:$PATH
export I=""

# check for loaded ALSA drivers and saved ALSA mixer settings (alsactl)
if [ -e /proc/asound  -a  -e /var/lib/alsa/asound.state -a  \
	\! \( $HANDLEALSA = "yes" -o $HANDLEALSA = "YES" \) ]; then
	log_warning_msg "Saved ALSA mixer settings detected; aumix will not" \
		"touch mixer."
	exit 0
fi

# if we have devfs mounted and there are mixer devices, use it rather then
# try-and-error methods
if test -d /dev/sound/; then
	MIXERS=`cd /dev/sound; ls mixer* 2>/dev/null`
	mute ()
	{
		log_progress_msg "muting"
		for x in $MIXERS; do
			$AUMIX -d /dev/sound/$x -v 0
		done
	}
	load ()
	{
		log_action_begin_msg "Restoring mixer settings"
		for x in $MIXERS; do
			$AUMIX -d /dev/sound/$x -f $CONF${x#mixer} -L >/dev/null
			log_progress_msg "$x"
		done
		log_success_msg "done."
	}
	store ()
	{
		log_action_begin_msg "Saving mixer settings"
		for x in $MIXERS; do
			$AUMIX -d /dev/sound/$x -f $CONF${x#mixer} -S
			log_progress_msg "$x"
		done
	}
else
	# no devfs, probing
	store ()
	{
		I=""
		log_action_begin_msg "Saving mixer settings"
		while $AUMIX -d /dev/mixer$I -f $CONF$I -S \
			2>/dev/null >/dev/null; do
			log_progress_msg "mixer$I"
			test "x$I" = "x" && I=0
			I=`expr $I + 1`
		done
		if [ -z "$I" ]; then
			log_failure_msg "failed."
			return 1;
		fi
	}
	load ()
	{
		I=""
		log_action_begin_msg "Restoring mixer settings"
		while [ -f $CONF$I ] && $AUMIX -d /dev/mixer$I -f $CONF$I -L \
			2>/dev/null >/dev/null; do
			log_progress_msg "mixer$I"
			test "x$I" = "x" && I=0
			I=`expr $I + 1`
		done
		if [ -z "$I" ]; then
			log_failure_msg "failed."
			return 1;
		else
			log_success_msg "done."
		fi
	}
	mute ()
	{
		I=""
		log_progress_msg "muting"
		while $AUMIX -d /dev/mixer$I -v 0 2>/dev/null >/dev/null; do
			test "x$I" = "x" && I=0
			I=`expr $I + 1`
		done
	}
fi

case "$1" in
	start|restart|reload|force-reload)
		if [ -f $CONF ]; then
			rm -f /var/lock/aumix/saved
			load
		fi
		;;
	stop)
		if [ -f /var/lock/aumix/saved ] ; then
			log_warning_msg "Settings already stored and devices" \
				"muted, not saving again"
		else
			if store; then
				touch /var/lock/aumix/saved
				mute
			fi
		fi
		;;
	save)
		if [ -f /var/lock/aumix/saved ] ; then
			log_warning_msg "Settings already stored and devices" \
				"muted, not saving again"
		else
			store && log_success_msg "done."
		fi
		;;
	*)
		log_failure_msg "Usage: /etc/init.d/aumix {start|stop|save}"
		exit 1
		;;
esac
