[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--