#!/bin/bash

STATEPATH=/var/lib/hal/asound

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 $HAL_PROP_ALSA_CARD set "$1" "$2" >/dev/null 2>&1
	$AMIXER -c $HAL_PROP_ALSA_CARD set "$1" unmute >/dev/null 2>&1
}

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

restore_mixer()
{
	ret=`$ALSACTL -F -f "$STATEPATH/$HAL_PROP_ALSA_CARD.state" restore $HAL_PROP_ALSA_CARD 2>&1`
	[ "$ret" = "" ] || return 1
}

save_mixer()
{
	rm -f "$STATEPATH/$HAL_PROP_ALSA_CARD.state"
	$ALSACTL -f "$STATEPATH/$HAL_PROP_ALSA_CARD.state" store $HAL_PROP_ALSA_CARD
	ret=$?
	return $ret
}

case "$(basename -- "$0")" in
hal-system-alsa-mixer-restore-linux)
	[ -f "$STATEPATH/$HAL_PROP_ALSA_CARD.state" ] || set_mixer_default
	restore_mixer || set_mixer_default
	exit 0
	;;

hal-system-alsa-mixer-save-linux)
	save_mixer
	exit 0
	;;
hal-system-alsa-mixer-reset-linux)
	rm -f $STATEPATH/$HAL_PROP_ALSA_CARD.state
	save_mixer
	exit 0
	;;
*)
	exit 1
	;;
esac
