#!/bin/bash

STATEPATH=/var/lib/alsa
RESPATH=/dev/.udev/alsa

AMIXER=/usr/bin/amixer
ALSACTL=/usr/sbin/alsactl

# Fail if needed files and directories are not available,
# so that the event can be retried later.
[ -d "$STATEPATH" ] && [ -x "$AMIXER" ] && [ -x "$ALSACTL" ] || exit 1

mixer()
{
	$AMIXER -c $1 set "$2" "$3" >/dev/null 2>&1
	$AMIXER -c $1 set "$2" unmute >/dev/null 2>&1
}

set_mixer_default()
{
	mixer $1 Master 75%
	mixer $1 PCM 90%
	mixer $1 Front 100%
	mixer $1 Synth 90%
	mixer $1 CD 90%
	# mute mic
	$AMIXER -c $1 set Mic 0% mute >/dev/null 2>&1
	# ESS 1969 chipset has 2 PCM channels
	mixer $1 PCM,1 90%
	# Trident/YMFPCI/emu10k1
	mixer $1 Wave 100%
	mixer $1 Music 100%
	mixer $1 AC97 100%
	# CS4237B chipset:
	mixer $1 'Master Digital' 75%
	# Envy24 chips with analog outs
	mixer $1 DAC 90%
	mixer $1 DAC,0 90%
	mixer $1 DAC,1 90%
	# some notebooks use headphone instead of master
	mixer $1 Headphone 75%
	mixer $1 Playback 100%
	mixer $1 Speaker 75%
	save_mixer $1
	exit 0
}

restore_mixer()
{
	ret=`$ALSACTL -F -f "$STATEPATH/controlC$1" restore $1 2>&1`
	if [ "$ret" = "" ]; then
		touch "$RESPATH/controlC$1"
	else
		rm -f "$RESPATH/controlC$1"
		return 1
	fi
}

save_mixer()
{
	rm -f "$STATEPATH/controlC$1"
	$ALSACTL -f "$STATEPATH/controlC$1" store $1
	ret=$?
	return $ret
}

[ -d "$RESPATH" ] || mkdir -p $RESPATH

if [ -n "$DEVPATH" ]; then
	CARDS="$DEVPATH"
else
	CARDS=$(ls -d /sys/class/sound/controlC* 2>/dev/null)
fi
if [ -n "$CARDS" ]; then
	for n in $CARDS; do
		n=${n#*controlC}
		[ -f "$STATEPATH/controlC$n" ] || set_mixer_default $n
		if [ -f "$RESPATH/controlC$n" ]; then
			save_mixer $n
		else
			restore_mixer $n
		fi
	done
fi

