> > alsasound script calls alsactl and card-specific scripts (if any).
> > this should be avoided in the case of partial load.
>
> Yes, I took care of executing them just for the cards that had been
> loaded.
>
> > IIRC, modprobe returns 0 even if called with the existing module.
> > (if the load failed, it returns 255, btw).
> > thus, we cannot check this only from the return value of modprobe.
> > instead we need to grep /proc/asound/modules for that module.
>
> That's what I'm doing, more or less. I'm including a copy of the
> modified alsasound script I'm testing. Seems to be working fine so far.
>
> I think the sequencer driver part is wrong. I don't know what is
> expected there (ie: multiple drivers?). I suspect I have to turn that
> part of the code into a loop iterating over all sequencer drivers.
It was wrong, of course... I'm including an updated script that is
apparently working fine. Takes into account multiple sequencer drivers
and executes scripts only for devices loaded while it runs.
-- Fernando
#!/bin/bash
#
# alsasound This shell script takes care of starting and stopping
# the ALSA sound driver.
#
# This script requires /usr/sbin/alsactl and /usr/bin/aconnect programs
# from the alsa-utils package.
#
# Copyright (c) by Jaroslav Kysela <[EMAIL PROTECTED]>
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
# For RedHat 5.0+:
# chkconfig: 2345 87 14
# description: ALSA driver
#
# modified to visually fit into SuSE 6.0+ by Philipp Thomas <[EMAIL PROTECTED]>
# further improvements by Bernd Kaindl, Olaf Hering and Takashi Iwai.
#
### BEGIN INIT INFO
# Provides: alsasound
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 5
# Default-Stop:
# Description: Loading ALSA drivers and store/restore the current setting
### END INIT INFO
if [ -e /etc/rc.d/init.d/functions ] ; then
# redhat function library
redhat=1
. /etc/rc.d/init.d/functions
fi
if [ -r /etc/rc.config ]; then
. /etc/rc.config
rc_warning="\033[33m\033[1m"
else
rc_done="done"
rc_warning=""
rc_reset=""
fi
if [ x$START_ALSA != xno ]; then
START_ALSA=yes
fi
if [ x$START_ALSA_SEQ != xno ]; then
START_ALSA_SEQ=yes
fi
# Determine the base and follow a runlevel link name.
base=${0##*/}
link=${base#*[SK][0-9][0-9]}
# Force execution if not called by a runlevel directory.
test $link = $base && START_ALSA=yes
test "$START_ALSA" = yes || exit 0
alsactl=/usr/sbin/alsactl
asoundcfg=/etc/asound.state
aconnect=/usr/bin/aconnect
alsascrdir=/etc/alsa.d
function start() {
#
# insert all sound modules that are not already loaded
#
drivers=`/sbin/modprobe -c | \
grep -E "^[[:space:]]*alias[[:space:]]+snd-card-[[:digit:]]" | \
awk '{print $3}'`
loaded=""
for i in $drivers; do
if [ "$i" != off ]; then
is_loaded=`grep -c ^$i /proc/modules`
if [ "$is_loaded" == "0" ]; then
if [ $redhat ] ; then
action "Starting sound driver $i" /sbin/modprobe $i
if [ "$?" == "0" ]; then loaded="$loaded $i" ; fi
else
echo -n "Starting sound driver: $i "
/sbin/modprobe $i
if [ "$?" == "0" ]; then loaded="$loaded $i" ; fi
echo -e "$rc_done"
fi
else
if [ $redhat ] ; then
echo "Sound driver $i is already loaded"
fi
fi
fi
done
#
# insert sequencer modules that are not already loaded
#
if [ x"$START_ALSA_SEQ" = xyes -a -r /proc/asound/seq/drivers ]; then
seq_drivers=`cut -d , -f 1 /proc/asound/seq/drivers`
for i in $seq_drivers; do
is_loaded=`grep -c ^$i /proc/modules`
if [ "$is_loaded" == "0" ]; then
if [ $redhat ] ; then
action "Starting sequencer driver $i" /sbin/modprobe $i
else
/sbin/modprobe $i
fi
else
if [ $redhat ] ; then
echo "Sequencer driver $i is already loaded"
fi
fi
done
fi
#
# restore driver settings
#
if [ -d /proc/asound ]; then
if [ ! -r $asoundcfg ]; then
echo "No mixer config in $asoundcfg, you have to unmute your card!"
else
if [ -x $alsactl ]; then
if [ $redhat ] ; then
action "Restoring sound driver settings" $alsactl -f $asoundcfg restore
else
$alsactl -f $asoundcfg restore
fi
else
if [ $redhat ] ; then
echo -n "Sound driver: could not find alsactl"
failure "Finding alsactl" && echo
else
echo -e "${rc_warning}ERROR: alsactl not found${rc_reset}"
fi
fi
fi
fi
#
# run card-dependent scripts only for drivers we loaded
#
for i in $loaded; do
t=${i##snd-}
if [ -x $alsascrdir/$t ]; then
if [ $redhat ] ; then
action "Running $t script" $alsascrdir/$t
else
$alsascrdir/$t
fi
fi
done
#
# touch lockfile if lockdir exists
#
if [ -d /var/lock/subsys ] ; then
touch /var/lock/subsys/alsasound
fi
}
function terminate() {
#
# Kill processes holding open sound devices
#
# DEVS=`find /dev/ -follow -type c -maxdepth 1 -print 2>/dev/null | xargs ls -dils | grep "1*1[46]," | cut -d: -f2 | cut -d" " -f2; echo /proc/asound/dev/*`
ossdevs="/dev/admmidi? /dev/adsp? /dev/amidi? /dev/audio* /dev/dmfm* \
/dev/dmmidi? /dev/dsp* /dev/dspW* /dev/midi0? /dev/mixer? /dev/music \
/dev/patmgr? /dev/sequencer* /dev/sndstat"
alsadevs="/proc/asound/dev/*"
fuser -k $ossdevs $alsadevs 2> /dev/null 1>/dev/null
#
# remove all sequencer connections if any
#
if [ -f /proc/asound/seq/clients -a -x $aconnect ]; then
$aconnect --removeall
fi
}
function stop() {
#
# store driver settings
# [nando: we always initialize the driver to the default settings]
#
# if [ -x $alsactl ]; then
# $alsactl -f $asoundcfg store
# else
# echo -n -e "${rc_warning}!!!alsactl not found!!!${rc_reset} "
# fi
#
# remove all sound modules
#
/sbin/lsmod | grep -E "^snd" | grep -Ev "^(snd-page-alloc|snd-hammerfall-mem)" | while read line; do \
/sbin/rmmod `echo $line | cut -d ' ' -f 1`; \
done
# remove the 2.2 soundcore module (if possible)
/sbin/rmmod soundcore 2> /dev/null
/sbin/rmmod gameport 2> /dev/null
#
# remove lockfile if lockdir exists
#
if [ -d /var/lock/subsys ] ; then
rm -f /var/lock/subsys/alsasound
fi
}
# See how we were called.
case "$1" in
start)
# Start driver if it isn't already up.
if [ -d /proc/asound ]; then
echo "ALSA driver already running"
fi
start
if [ $redhat ] ; then
if [ -d /proc/asound -a -d /var/lock/subsys ]; then
touch /var/lock/subsys/alsasound
fi
fi
;;
stop)
# Stop daemons.
if [ -d /proc/asound ]; then
echo -n "Shutting down sound driver"
terminate
stop
if [ $redhat ] ; then
if [ -d /var/lock/subsys ]; then
rm -f /var/lock/subsys/alsasound
fi
success "sound driver stop" && echo
else
echo -e "$rc_done"
fi
fi
;;
restart|reload)
$0 stop
$0 start
;;
status)
if [ -d /proc/asound ]; then
echo -n "ALSA sound driver loaded."
else
echo -n "ALSA sound driver not loaded."
fi
echo
;;
*)
echo "Usage: alsasound {start|stop|restart|status}"
exit 1
esac
exit 0