[PlanetCCRMA] usb audio and midi devices: loading and unloading
drivers
Fernando Pablo Lopez-Lezcano
nando@ccrma.Stanford.EDU
Wed Mar 5 16:15:01 2003
--=-vWzWSJ83/LXScAsyzH3I
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
> Solution: install the alsasound script (see below for short HOWTO) that
> I include as an attachment at the end of this email.
Now I'm really including it :-)
-- Fernando
--=-vWzWSJ83/LXScAsyzH3I
Content-Disposition: attachment; filename=alsasound
Content-Transfer-Encoding: quoted-printable
Content-Type: text/x-sh; name=alsasound; charset=ISO-8859-1
#!/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 <perex@suse.cz>=20
#
#
# 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 <pthomas@suse.d=
e>
# modified to start only drivers that are not already loaded and to visuall=
y
# fit into RedHat 7.2+ by Fernando Lopez-Lezcano <nando@ccrma.stanford.edu=
>
# further improvements by Bernd Kaindl, Olaf Hering and Takashi Iwai.
#=20
### 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 settin=
g
### END INIT INFO
if [ -e /etc/rc.d/init.d/functions ] ; then
# redhat function library
redhat=3D1
. /etc/rc.d/init.d/functions
fi
if [ -r /etc/rc.config ]; then
. /etc/rc.config
rc_warning=3D"\033[33m\033[1m"
else
rc_done=3D"done"
rc_warning=3D""
rc_reset=3D""
fi
if [ x$START_ALSA !=3D xno ]; then
START_ALSA=3Dyes
fi
if [ x$START_ALSA_SEQ !=3D xno ]; then
START_ALSA_SEQ=3Dyes
fi
# Determine the base and follow a runlevel link name.
base=3D${0##*/}
link=3D${base#*[SK][0-9][0-9]}
# Force execution if not called by a runlevel directory.
test $link =3D $base && START_ALSA=3Dyes
test "$START_ALSA" =3D yes || exit 0
alsactl=3D/usr/sbin/alsactl
asoundcfg=3D/etc/asound.state
aconnect=3D/usr/bin/aconnect
alsascrdir=3D/etc/alsa.d
function start() {
#
# insert sound modules that are not already loaded
#
drivers=3D`/sbin/modprobe -c | \
grep -E "^[[:space:]]*alias[[:space:]]+snd-card-[[:digit:]]" | \
awk '{print $3}'`
loaded=3D""
for i in $drivers; do
if [ "$i" !=3D off ]; then
is_loaded=3D`grep -c ^$i /proc/modules`
if [ "$is_loaded" =3D=3D "0" ]; then
if [ $redhat ] ; then
action "Starting sound driver $i" /sbin/modprobe $i
if [ "$?" =3D=3D "0" ]; then loaded=3D"$loaded $i" ; fi
else
echo -n "Starting sound driver: $i "
/sbin/modprobe $i
if [ "$?" =3D=3D "0" ]; then loaded=3D"$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" =3D xyes -a -r /proc/asound/seq/drivers ]; then
seq_drivers=3D`cut -d , -f 1 /proc/asound/seq/drivers`
for i in $seq_drivers; do
is_loaded=3D`grep -c ^$i /proc/modules`
if [ "$is_loaded" =3D=3D "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 restor=
e
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=3D${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=3D`find /dev/ -follow -type c -maxdepth 1 -print 2>/dev/null | xar=
gs ls -dils | grep "1*1[46]," | cut -d: -f2 | cut -d" " -f2; echo /proc/aso=
und/dev/*`
ossdevs=3D"/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=3D"/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 [ -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
--=-vWzWSJ83/LXScAsyzH3I--