All pastes #372910 Raw Edit

Rugludallur

public text v1 · immutable
#372910 ·published 2007-02-26 11:20 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
}