|
发表于 2007-3-1 21:17:07
|
显示全部楼层
lz 的脚本还不错,就是少了一些功能, 比如模块配置放在 /etc/modprobe.conf 里, 启动时恢复音量, 退出时保存音量.
看看 alsa 自带的脚本吧(我相信 fc6 也会有类似的功能完全的脚本的)
- #!/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>
- #
- #
- # 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.de>
- # 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 [ -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
- if [ -x /sbin/lsmod ]; then
- lsmod=/sbin/lsmod
- else
- lsmod=lsmod
- fi
- # modprobe returns 255 when failed..
- function probe_module () {
- /sbin/modprobe $*
- test $? = 0 && return 0
- return 1
- }
- function start() {
- #
- # insert all sound modules
- #
- module_loaded=0
- drivers=`/sbin/modprobe -c | \
- grep -E "^[[:space:]]*alias[[:space:]]+snd-card-[[:digit:]]" | \
- awk '{print $3}'`
- for i in $drivers; do
- if [ "$i" != off ]; then
- echo -n "Starting sound driver: $i "
- probe_module $i && module_loaded=1
- echo -e "$rc_done"
- fi
- done
- test $module_loaded -eq 0 && return
- #
- # insert sequencer modules
- #
- if [ x"$START_ALSA_SEQ" = xyes -a -r /proc/asound/seq/drivers ]; then
- cut -d , -f 1 /proc/asound/seq/drivers | \
- while read t ; do
- test -z $t || /sbin/modprobe $t
- 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
- $alsactl -F -f $asoundcfg restore
- else
- echo -e "${rc_warning}ERROR: alsactl not found${rc_reset}"
- fi
- fi
- fi
- #
- # run card-dependent scripts
- for i in $drivers; do
- t=${i##snd-}
- if [ -x $alsascrdir/$t ]; then
- $alsascrdir/$t
- 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/*`
- fuser -k /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 >/dev/null 2>&1
- if [ -d /proc/asound/dev ]; then
- fuser -k /proc/asound/dev/* >/dev/null 2>&1
- fi
- if [ -d /dev/snd ]; then
- fuser -k /dev/snd/* >/dev/null 2>&1
- fi
- #
- # remove all sequencer connections if any
- #
- if [ -f /proc/asound/seq/clients -a -x $aconnect ]; then
- $aconnect --removeall
- fi
- }
- function stop() {
- #
- # store driver settings
- #
- if [ -x $alsactl ]; then
- $alsactl -f $asoundcfg store
- else
- echo -n -e "${rc_warning}!!!alsactl not found!!!${rc_reset} "
- fi
- #
- # mute master to avoid clicks at unload
- #
- /usr/bin/amixer set Master mute >/dev/null 2>&1
- #
- # remove all sound modules
- #
- $lsmod | grep -E "^snd" | grep -Ev "(snd-page-alloc|snd_page_alloc)" | 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
- start
- else
- echo "ALSA driver is already running."
- fi
- ;;
- stop)
- # Stop daemons.
- if [ -d /proc/asound ]; then
- echo -n "Shutting down sound driver: "
- terminate
- stop
- echo -e "$rc_done"
- 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
复制代码 |
|