[sisyphus] I: sound-scripts-0.2

Michael Shigorin =?iso-8859-1?q?mike_=CE=C1_osdn=2Eorg=2Eua?=
Ср Ноя 12 15:46:45 MSK 2003


	Здравствуйте.
Прилагается попытка зафиксить sound-scripts хотя бы немного.

Ее надо проверить на нормальную отработку ситуации:

- одна звуковая карта (точнее, один драйвер);
- alsa или oss;
- наличие/отсутствие /etc/asound.state или /etc/.aumixrc, соотв.

Ожиаемый эффект:

- инициализируется указанный для sound-slot-0 драйвер;
- при отсутствии сохраненных значений уровней выставляются
  более-менее разумные;
- при наличии сохраненных значений уровней они применяются,
  по возможности используя alsactl (alsa-utils) для микшера alsa.

---

* Wed Nov 12 2003 Michael Shigorin <mike на altlinux.ru> 0.2-alt1
- fixed #1049, #1711 -- introduced initial specific ALSA support
  (modified patch by Dmitry Vukolov <dvukol rosmail ru>):
  * alsactl save/restore;
  * if /etc/asound.state is absent, initialize the mixer with
    non-zero values and unmuted channels.
- added TODO

-- 
 ---- WBR, Michael Shigorin <mike на altlinux.ru>
  ------ Linux.Kiev http://www.linux.kiev.ua/
----------- следующая часть -----------
#!/bin/sh
# $Id: sound,v 1.14 2003/10/08 15:03:12 ldv Exp $
#
# sound:   This shell script launch the sound on your system.
#
# chkconfig: 2345 30 70
# description: This shell script launch the sound on your system.
# halt: yes

# Do not load RH compatibility interface.
WITHOUT_RC_COMPAT=1

# Source function library.
. /etc/init.d/functions

PKLVL=
SOUND_ALSA=

ChangePrintk()
{
	[ -n "$PKLVL" ] || PKLVL=`sed 's/^\(.\).*/\1/' < /proc/sys/kernel/printk`
	sysctl -w kernel.printk=0
}
	
exit_handler()
{
	local rc=$?
	trap - EXIT
	[ -z "$PKLVL" ] || sysctl -w "kernel.printk=$PKLVL"
	exit $rc
}

trap exit_handler SIGHUP SIGPIPE SIGINT SIGQUIT SIGTERM EXIT

LOCKFILE=/var/lock/subsys/sound

AUMIX=
[ ! -x /usr/bin/aumix ] || AUMIX=/usr/bin/aumix
[ ! -x /bin/aumix-minimal ] || AUMIX=/bin/aumix-minimal
ALSACTL=
[ -x /usr/sbin/alsactl ] && ALSACTL=/usr/sbin/alsactl

TMP_ALSA_STATE=`mktemp -t alsa-state.XXXXXX`

LookupDevices()
{
	egrep -qs '(sparcaudio|sound)' /proc/devices
}

LoadModule()
{
	local phrase=$1 pattern=$2 m opt=
	[ -n "$3" ] && opt='-r'
	for m in `modprobe -c |egrep "^alias $pattern " |cut -d\  -f3`; do
		if [ -n "$m" ] && [ "$m" != off ]; then
			action "$phrase ($m):" modprobe "$opt" "$m"
			local rc=$?
			[ $rc -eq 0 ] || return $rc
		fi
	done
}

load_alsa()
{
	modprobe -c |egrep '^alias [^ ]+ snd-' |cut -d\  -f3 |\
		while read line; do
			L=1
			action "Starting ALSA sound driver $line:" modprobe $line
		done
	if [ -d /proc/asound ]; then
 		RETVAL=0 start_mixer alsa
	fi
}

start_alsa()
{
	[ -d /proc/asound ] || load_alsa
	[ -d /proc/asound ] && touch "$LOCKFILE"
}

unload_alsa()
{
	RETVAL=0 stop_mixer alsa;
	/sbin/lsmod |grep "^snd" |
		while read line; do
			/sbin/rmmod `echo $line |cut -d\  -f 1`
		done
	/sbin/rmmod soundcore 2>/dev/null
}

fix_alsa_levels()
{
	# provide sane default audio levels even with alsa
	alsactl -f $TMP_ALSA_STATE store
	# set volume to 67%
	subst 's/(value\w*\S*)\s* 0/\1 20/' $TMP_ALSA_STATE
	# unmute all channels
	subst 's/(value\w*\S*)\s* false/\1 true/' $TMP_ALSA_STATE
	action "Initializing ALSA mixer settings" alsactl -f $TMP_ALSA_STATE restore
	rm -f $TMP_ALSA_STATE
}

start_mixer()
{
	LookupDevices || return
	# ALSA
	if [ "$1" = "alsa" -a -n "$ALSACTL" ]; then
		if [ -r /etc/asound.state ]; then
			action "Loading ALSA mixer settings:" "$ALSACTL" restore
		else 
			fix_alsa_levels
			return 0
		fi
	elif [ -n "$AUMIX" ]; then
		if [ -s /etc/.aumixrc ]; then
			action "Loading OSS mixer settings:" "$AUMIX" -f /etc/.aumixrc -L
		else
			action "Initializing OSS mixer settings:" "$AUMIX" -v90 -w90 -c90
		fi
	fi
}

stop_mixer()
{
	LookupDevices || return
	if [ "$1" = "alsa" -a -n "$ALSACTL" ]; then
		action "Saving ALSA mixer settings:" "$ALSACTL" store
	elif [ -n "$AUMIX" ]; then
		action "Saving OSS mixer settings:" "$AUMIX" -f /etc/.aumixrc -S
	fi
}

start()
{
	ChangePrintk
	# if there is alsa driver configured load it and exit.
	# FIXME: we know it's wrong since there could be OSS too.
	# TODO: for now codepaths are extremely crappy :((
	start_alsa && exit
	RETVAL=0
	LoadModule "Loading sound module" 'sound[^ ]*' || RETVAL=1
	LoadModule "Loading midi module" midi
	start_mixer oss
	touch "$LOCKFILE"
}

stop()
{
	ChangePrintk
	if [ -d /proc/asound ]; then
		unload_alsa
		rm -f "$LOCKFILE"
		return
	fi
	if [ -d /proc/asound ]; then
		stop_mixer alsa
	else
		stop_mixer oss
	fi
	LoadModule "Unloading midi module" midi REMOVE
	LoadModule "Unloading sound module" 'sound[^ ]*' REMOVE
	rm -f "$LOCKFILE"
}

restart()
{
	stop
	start
}

case $1 in
	start)
		start
		;;
	stop|condstop)
		stop
		;;
	restart|reload)
		restart
		;;
	status)
		if lsmod |egrep -qs '^(sound|snd)'; then
			echo "Sound modules loaded"
		fi
		;;
	condrestart|condreload)
		;;
	*)
		msg_usage "${0##*/} {start|stop|restart|status}"
		exit 1
esac
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20031112/93b3dbce/attachment-0009.bin>


Подробная информация о списке рассылки Sisyphus