#!/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 |sort |uniq`; do if [ -n "$m" ] && [ "$m" != off ]; then action "$phrase ($m):" modprobe "$opt" "$m" local rc=$? [ $rc -eq 0 ] || return $rc fi done } load_alsa() # redo with LoadModule? { modprobe -c |egrep '^alias [^ ]+ snd-' |cut -d\ -f3 |sort |uniq\ 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