All pastes #213884 Raw Edit

Someone

public text v1 · immutable
#213884 ·published 2006-10-21 18:02 UTC
rendered paste body
#!/sbin/runscript
# $Header: /var/cvsroot/gentoo-x86/media-sound/alsa-utils/files/alsasound-1.0.10_rc2,v 1.2 2005/12/15 22:42:46 flameeyes Exp $
#
# Gentoo users: add this script to 'boot' run level.
# ==================================================
#
# 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>
#
#
#  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

# ChangeLog:
#
# 2003.07.29 - John Mylchreest <johnm@gentoo.org>
# Edited to support Linux kernel 2.5 and above as well as 2.4
#
# 2004.06.02 - Jeremy Huddleston <eradicator@gentoo.org>
# Rewritten for better support for built-in drivers
#
# 2004.10.29 - Jeremy Huddleston <eradicator@gentoo.org>
# Cleaned up to work better for mixed builtin/module systems
#
# 2004.11.29 - Jeremy Huddleston <eradicator@gentoo.org>
# Added save option thanks to Ben Anderson <roothorick@new.rr.com>
#
# 2005.04.21 - Jeremy Huddleston <eradicator@gentoo.org>
# Added restore option and oss option.
# Cleaned up code to use bash builtins instead of test.

alsactl=/usr/sbin/alsactl
asoundcfg=/etc/asound.state
aconnect=/usr/bin/aconnect
alsascrdir=/etc/alsa.d

opts="${opts} save restore"

depend() {
        need bootmisc localmount
        after modules isapnp coldplug hotplug
}

load_modules() {
        # List of drivers for each card.
        local DRIVERS="$(modprobe -c | grep -E "^[[:space:]]*alias[[:space:]]+snd-card-[[:digit:]]" | awk '{print $2}')"

        # Fall back on the automated aliases if we don't have ALSA configured properly...
        if [[ -z "${DRIVERS}" && ! ( -d /proc/asound && -z "$(grep ' no soundcards ' /proc/asound/cards)" ) ]] ; then
                ewarn "Could not detect custom ALSA settings.  Loading all detected alsa drivers."
                DRIVERS="$(modprobe -c | grep pci: |  awk '{ print $3 }' | grep snd.* | sort | uniq)"
                [[ -z "${DRIVERS}" ]] && eerror "Unable to find any ALSA drivers. Have you compiled alsa-drivers correctly?"
        fi

        if [[ ${ENABLE_OSS_EMUL} == "yes" ]] && modprobe -c | grep -q "snd.*oss$" ; then
                # Test for use of OSS
                local OSS="$(modprobe -l | grep "snd.*oss" | sed -e "s:\/.*\/::" -e "s:\..*::")"
                # Add oss modules to list
                local i
                for i in ${OSS}
                do
                        DRIVERS="${DRIVERS} ${i}"
                done
        fi

        # We want to ensure snd-seq is loaded as it is needed for things like
        # timidity even if we don't use a real sequencer.
        DRIVERS="${DRIVERS} $(modprobe -l | grep "snd.seq\." | sed -e "s:\/.*\/::" -e "s:\..*::")"

        # We want to ensure snd-ioctl32 is loaded as it is needed for 32bit
        # compatibility
        DRIVERS="${DRIVERS} $(modprobe -l | grep "snd.ioctl32\." | sed -e "s:\/.*\/::" -e "s:\..*::")"

        local DRIVER
        for DRIVER in ${DRIVERS}
        do
                if [[ "${DRIVER}" != "off"  &&
                      -z $(cut -d' ' -f1 /proc/modules | egrep "^${DRIVER}\$") &&
                      -z $(cut -d' ' -f1 /proc/modules | egrep "^${DRIVER//-/_}\$") ]] ; then
                        ebegin "  Loading: ${DRIVER}"
                        /sbin/modprobe ${DRIVER}
                        eend $?
                fi
        done

        sleep 1

        if [[ -f /proc/asound/seq/drivers ]] ; then
                local SEQUENCERS="$(awk -F, '$2~/^empty$/ {print $1}' /proc/asound/seq/drivers)"
                local SEQUENCER
                for SEQUENCER in ${SEQUENCERS}
                do
                        if [[ -z $(cut -d' ' -f1 /proc/modules | egrep "^${SEQUENCER}\$")  &&
                              -z $(cut -d' ' -f1 /proc/modules | egrep "^${SEQUENCER//-/_}\$") ]] ; then
                                ebegin "  Loading: ${SEQUENCER}"
                                /sbin/modprobe ${SEQUENCER}
                                eend $?
                        fi
                done
        fi

        for DRIVER in ${DRIVERS}
        do
                local TMP=${DRIVER##snd-}
                TMP=${TMP##snd_}
                if [[ -x "${alsascrdir}/${TMP}" ]] ; then
                        ebegin "  Running: ${alsascrdir}/${TMP}"
                        ${alsascrdir}/${TMP}
                        eend $?
                fi
        done

        if [[ ! -d /proc/asound || -n "$(grep ' no soundcards ' /proc/asound/cards)" ]] ; then
                eerror "ERROR: Failed to load necessary drivers"
        fi
}

unload_modules() {
        local LOADED_MODULES="$(/sbin/lsmod | grep -E "^snd" | awk '{print $1}')"
        local MODULE
        for MODULE in ${LOADED_MODULES}
        do
                /sbin/rmmod ${MODULE} >& /dev/null
        done
        /sbin/rmmod soundcore >& /dev/null
        /sbin/rmmod gameport >& /dev/null

        # Return success if the modules are unloaded
        [[ -z "$(/sbin/lsmod | grep -E "^snd" | awk '{print $1}')" ]]
}

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/*`
        local 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"
        local alsadevs="/proc/asound/dev/* /dev/sound/* /dev/snd/*"
        fuser -k ${ossdevs} ${alsadevs} >& /dev/null

        #
        # remove all sequencer connections if any
        #
        [[ -f /proc/asound/seq/clients && -x ${aconnect} ]] && ${aconnect} --removeall
}

restore_mixer() {
        if [[ ${RESTORE_ON_START} == "no" ]] ; then
                return 0
        fi

        restore
}

restore() {
        ebegin "Restoring Mixer Levels"

        local val=0

        if [[ ! -r ${asoundcfg} ]] ; then
                ewarn "No mixer config in ${asoundcfg}, you have to unmute your card!"
        elif [[ -x ${alsactl} ]] ; then
                local CARDS="$(cat /proc/asound/cards | awk '/: / { print $1 }')"
                local CARDNUM
                for CARDNUM in ${CARDS}
                do
                        [[ -e /dev/snd/controlC0 ]] || sleep 2
                        [[ -e /dev/snd/controlC0 ]] || sleep 2
                        [[ -e /dev/snd/controlC0 ]] || sleep 2
                        [[ -e /dev/snd/controlC0 ]] || sleep 2
                        ${alsactl} -f ${asoundcfg} restore ${CARDNUM} || ewarn "Errors while restoring defaults, ignoring"
                done
        else
                eerror -e "ERROR: Cannot find alsactl, did you forget to install media-sound/alsa-utils?"
                val=1
        fi

        eend ${val}
        return ${val}
}

save() {
        ebegin "Storing ALSA Mixer Levels"

        local val=0

        if [[ -x ${alsactl} ]] ; then
                ${alsactl} -f ${asoundcfg} store
                val=$?
        else
                eerror -e "ERROR: Cannot find alsactl."
                val=1
        fi

        eend ${val}
        return ${val}
}

start() {
        if [[ -f /proc/modules ]] ; then
                ebegin "Loading ALSA modules"
                if load_modules ; then
                        eend 0
                else
                        eend 1
                        return 1
                fi
        fi

        if [[ ${RESTORE_ON_START} == "yes" ]]; then
                restore_mixer
        fi
}

stop() {
        if [[ ! -d /proc/asound ]] ; then
                eerror "ALSA is not loaded"
                return 0
        fi

        if [[ ${SAVE_ON_STOP} == "yes" ]]; then
                save
        fi

        ebegin "Unloading ALSA"
        terminate
        eend 0

        if [[ -f /proc/modules ]]; then
                ebegin "Unloading ALSA modules"
                if unload_modules; then
                        eend 0
                else
                        eend 1
                fi
        fi
}