home *** CD-ROM | disk | FTP | other *** search
/ tusportal.tus.k12.pa.us / tusportal.tus.k12.pa.us.tar / tusportal.tus.k12.pa.us / Wyse / latest-image.raw / 0.img / etc / init.d / alsasound < prev    next >
Text File  |  2012-08-08  |  11KB  |  454 lines

  1. #!/bin/sh
  2. #
  3. # alsasound     This shell script takes care of starting and stopping
  4. #               the ALSA sound driver.
  5. #
  6. # This script requires /usr/sbin/alsactl program from alsa-utils package.
  7. #
  8. # Copyright (c) by Jaroslav Kysela <perex@suse.cz> 
  9. #
  10. #
  11. #  This program is free software; you can redistribute it and/or modify
  12. #  it under the terms of the GNU General Public License as published by
  13. #  the Free Software Foundation; either version 2 of the License, or
  14. #  (at your option) any later version.
  15. #
  16. #  This program is distributed in the hope that it will be useful,
  17. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19. #  GNU General Public License for more details.
  20. #
  21. #  You should have received a copy of the GNU General Public License
  22. #  along with this program; if not, write to the Free Software
  23. #  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24. #
  25. #
  26. # For RedHat 5.0+:
  27. # chkconfig: 2345 87 14
  28. # description: ALSA driver
  29. #
  30. # modified to visually fit into SuSE 6.0+ by Philipp Thomas <pthomas@suse.de>
  31. # further improvements by Bernd Kaindl, Olaf Hering and Takashi Iwai.
  32. ### BEGIN INIT INFO
  33. # Provides:       alsasound
  34. # Required-Start: 
  35. # Should-Start: $remote_fs resmgr
  36. # Required-Stop:  
  37. # Should-Stop: $remote_fs resmgr
  38. # Default-Start:  2 3 5
  39. # Default-Stop:
  40. # Short-Description: Set up ALSA sound system
  41. # Description:    Loading ALSA drivers and store/restore the current setting
  42. ### END INIT INFO
  43.  
  44. . /etc/rc.status
  45. . /etc/sysconfig/sound
  46.  
  47. # Shell functions sourced from /etc/rc.status:
  48. #      rc_check         check and set local and overall rc status
  49. #      rc_status        check and set local and overall rc status
  50. #      rc_status -v     ditto but be verbose in local rc status
  51. #      rc_status -v -r  ditto and clear the local rc status
  52. #      rc_failed        set local and overall rc status to failed
  53. #      rc_reset         clear local rc status (overall remains)
  54. #      rc_exit          exit appropriate to overall rc status
  55.  
  56. # First reset status of this service
  57. rc_reset
  58.  
  59. alsactl=/usr/sbin/alsactl
  60. asoundcfg=/etc/asound.state
  61. aconnect=/usr/bin/aconnect
  62.  
  63. bugout() { echo "${MYNAME}: Programming error" >&2 ; exit 123 ; }
  64.  
  65. echo_card_indices()
  66. {
  67.     if [ -f /proc/asound/cards ] ; then
  68.         sed -n -e's/^[[:space:]]*\([0-7]\)[[:space:]].*/\1/p' /proc/asound/cards
  69.     fi
  70. }
  71.  
  72. filter_amixer_output()
  73. {
  74.     sed \
  75.         -e '/Unable to find simple control/d' \
  76.         -e '/Unknown playback setup/d' \
  77.         -e '/^$/d'
  78. }
  79.  
  80. # The following functions try to set many controls.
  81. # No card has all the controls and so some of the attempts are bound to fail.
  82. # Because of this, the functions can't return useful status values.
  83.  
  84. # $1 <control>
  85. # $2 <level>
  86. # $CARDOPT
  87. unmute_and_set_level()
  88. {
  89.     { [ "$2" ] && [ "$CARDOPT" ] ; } || bugout
  90.     amixer $CARDOPT -q set "$1" "$2" unmute 2>&1 | filter_amixer_output || :
  91.     return 0
  92. }
  93.  
  94. # $1 <control>
  95. # $CARDOPT
  96. mute_and_zero_level()
  97. {
  98.     { [ "$1" ] && [ "$CARDOPT" ] ; } || bugout
  99.     amixer $CARDOPT -q set "$1" "0%" mute 2>&1 | filter_amixer_output || :
  100.     return 0
  101. }
  102.  
  103. # $1 <control>
  104. # $2 "on" | "off"
  105. # $CARDOPT
  106. switch_control()
  107. {
  108.     { [ "$2" ] && [ "$CARDOPT" ] ; } || bugout
  109.     amixer $CARDOPT -q set "$1" "$2" 2>&1 | filter_amixer_output || :
  110.     return 0
  111. }
  112.  
  113. # $1 <card ID>
  114. sanify_levels_on_card()
  115. {
  116.     CARDOPT="-c $1"
  117.  
  118.     unmute_and_set_level "Master" "80%"
  119.     unmute_and_set_level "Master Mono" "80%"      # Debian #406047
  120.     unmute_and_set_level "Master Digital" "80%"   # E.g., cs4237B
  121.     unmute_and_set_level "Playback" "80%"
  122.     unmute_and_set_level "Headphone" "70%"
  123.     unmute_and_set_level "Speaker" "100%"
  124.     unmute_and_set_level "PCM" "80%"
  125.     unmute_and_set_level "PCM,1" "80%"   # E.g., ess1969
  126.     unmute_and_set_level "DAC" "80%"     # E.g., envy24, cs46xx
  127.     unmute_and_set_level "DAC,0" "80%"   # E.g., envy24
  128.     unmute_and_set_level "DAC,1" "80%"   # E.g., envy24
  129.     unmute_and_set_level "Synth" "80%"
  130.     unmute_and_set_level "CD" "80%"
  131.  
  132.     mute_and_zero_level "Mic"
  133.     mute_and_zero_level "IEC958"         # Ubuntu #19648
  134.  
  135.     # Intel P4P800-MX  (Ubuntu bug #5813)
  136.     switch_control "Master Playback Switch" on
  137.     switch_control "Master Surround" on
  138.  
  139.     # Trident/YMFPCI/emu10k1:
  140.     unmute_and_set_level "Wave" "80%"
  141.     unmute_and_set_level "Music" "80%"
  142.     unmute_and_set_level "AC97" "80%"
  143.  
  144.     # DRC:
  145.     unmute_and_set_level "Dynamic Range Compression" "80%"
  146.  
  147.     # Required for HDA Intel (hda-intel):
  148.     unmute_and_set_level "Front" "80%"
  149.  
  150.     # Required for SB Live 7.1/24-bit (ca0106):
  151.     unmute_and_set_level "Analog Front" "80%"
  152.  
  153.     # Required at least for Via 823x hardware on DFI K8M800-MLVF Motherboard with kernels 2.6.10-3/4 (see ubuntu #7286):
  154.     switch_control "IEC958 Capture Monitor" off
  155.  
  156.     # Required for hardware allowing toggles for AC97 through IEC958,
  157.     #  valid values are 0, 1, 2, 3. Needs to be set to 0 for PCM1.
  158.     unmute_and_set_level "IEC958 Playback AC97-SPSA" "0"
  159.  
  160.     # Required for newer Via hardware (see Ubuntu #31784)
  161.     unmute_and_set_level "VIA DXS,0" "80%"
  162.     unmute_and_set_level "VIA DXS,1" "80%"
  163.     unmute_and_set_level "VIA DXS,2" "80%"
  164.     unmute_and_set_level "VIA DXS,3" "80%"
  165.  
  166.     # Required on some notebooks with ICH4:
  167.     switch_control "Headphone Jack Sense" off
  168.     switch_control "Line Jack Sense" off
  169.  
  170.     # Some machines need one or more of these to be on;
  171.     # others need one or more of these to be off:
  172.     #
  173.     # switch_control "External Amplifier" on
  174.     switch_control "Audigy Analog/Digital Output Jack" on
  175.     switch_control "SB Live Analog/Digital Output Jack" on
  176.  
  177.     return 0
  178. }
  179.  
  180. # $1 <card ID> | "all"
  181. sanify_levels()
  182. {
  183.     TTSDML_RETURNSTATUS=0
  184.     case "$1" in
  185.       all)
  186.         for CARD in $(echo_card_indices) ; do
  187.             sanify_levels_on_card "$CARD" || TTSDML_RETURNSTATUS=1
  188.         done
  189.         ;;
  190.       *)
  191.         sanify_levels_on_card "$1" || TTSDML_RETURNSTATUS=1
  192.         ;;
  193.     esac
  194.     return $TTSDML_RETURNSTATUS
  195. }
  196.  
  197. # $1 <card ID>
  198. preinit_levels_on_card()
  199. {
  200.     CARDOPT="-c $1"
  201.  
  202.     # Silly dance to activate internal speakers by default on PowerMac
  203.     # Snapper and Tumbler
  204.     id=`cat /proc/asound/card$1/id 2>/dev/null`
  205.     if [ "$id" = "Snapper" -o "$id" = "Tumbler" ]; then
  206.         switch_control "Auto Mute" off
  207.         switch_control "PC Speaker" off
  208.         switch_control "Auto Mute" on
  209.     fi
  210. }
  211.  
  212. # $1 <card ID> | "all"
  213. preinit_levels()
  214. {
  215.     TTSDML_RETURNSTATUS=0
  216.     case "$1" in
  217.       all)
  218.         for CARD in $(echo_card_indices) ; do
  219.             preinit_levels_on_card "$CARD" || TTSDML_RETURNSTATUS=1
  220.         done
  221.         ;;
  222.       *)
  223.         preinit_levels_on_card "$1" || TTSDML_RETURNSTATUS=1
  224.         ;;
  225.     esac
  226.     return $TTSDML_RETURNSTATUS
  227. }
  228.  
  229. # $1 <card ID>
  230. mute_and_zero_levels_on_card()
  231. {
  232.     CARDOPT="-c $1"
  233.     for CTL in \
  234.         Master \
  235.         PCM \
  236.         Synth \
  237.         CD \
  238.         Line \
  239.         Mic \
  240.         "PCM,1" \
  241.         Wave \
  242.         Music \
  243.         AC97 \
  244.         "Master Digital" \
  245.         DAC \
  246.         "DAC,0" \
  247.         "DAC,1" \
  248.         Headphone \
  249.         Playback
  250.     do
  251.         mute_and_zero_level "$CTL"
  252.     done
  253. #    for CTL in \
  254. #        "Audigy Analog/Digital Output Jack" \
  255. #        "SB Live Analog/Digital Output Jack"
  256. #    do
  257. #        switch_control "$CTL" off
  258. #    done
  259.     return 0
  260. }
  261.  
  262. # $1 <card ID> | "all"
  263. mute_and_zero_levels()
  264. {
  265.     TTZML_RETURNSTATUS=0
  266.     case "$1" in
  267.       all)
  268.         for CARD in $(echo_card_indices) ; do
  269.             mute_and_zero_levels_on_card "$CARD" || TTZML_RETURNSTATUS=1
  270.         done
  271.         ;;
  272.       *)
  273.         mute_and_zero_levels_on_card "$1" || TTZML_RETURNSTATUS=1
  274.         ;;
  275.     esac
  276.     return $TTZML_RETURNSTATUS
  277. }
  278.  
  279.  
  280. function start_all_cards ()
  281. {
  282.     if ! test -f $asoundcfg; then
  283.         preinit_levels all
  284.         sanify_levels all
  285.         alsactl -f $asoundcfg store
  286.     fi
  287. }
  288.  
  289. #
  290. # insert sequencer modules
  291. #
  292. load_sequencer() {
  293.   test "$LOAD_SEQUENCER" = "yes" && modprobe -q snd-seq
  294.   if [ x"$LOAD_SEQUENCER" = xyes -a -r /proc/asound/seq/drivers ]; then
  295.     OLDIFS="$IFS"
  296.     IFS=","
  297.     while read t x c; do
  298.       /sbin/modprobe $t
  299.     done < /proc/asound/seq/drivers
  300.     IFS="$OLDIFS"
  301.   fi
  302. }
  303.  
  304. get_drivers() {
  305.   if [ -f /etc/modprobe.d/sound ]; then
  306.     cat /etc/modprobe.d/sound
  307.   else
  308.     /sbin/modprobe -c
  309.   fi | \
  310.     grep -E "^[[:space:]]*alias[[:space:]]+snd-card-[[:digit:]]" | sort | \
  311.     while read a b card; do
  312.     echo $card
  313.     done
  314. }
  315.  
  316. #
  317. # insert all sound modules
  318. #
  319. load_modules() {
  320.   module_loaded=0
  321.   c=""
  322.   drivers=`get_drivers`
  323.   for i in $drivers; do
  324.     if [ $i != off ]; then
  325.       if [ x$c = x ]; then
  326.         echo -n ": "
  327.     c=1
  328.       fi
  329.       echo -n " ${i##snd-}"
  330.       /sbin/modprobe $i && module_loaded=1
  331.     fi
  332.   done
  333.   rc_status -v -r
  334.   test $module_loaded -eq 0 && return 1
  335.   return 0
  336. }
  337.  
  338. #
  339. # rest of start action
  340. #
  341. start_rest() {
  342.   load_sequencer
  343.   if [ x"$LOAD_OSS_EMUL_MODULES" = xyes ]; then
  344.     /sbin/modprobe snd-pcm-oss
  345.     if [ x"$LOAD_OSS_SEQ_MODULE" = xyes ]; then
  346.         /sbin/modprobe snd-seq-oss
  347.     fi
  348.   fi
  349. }
  350.  
  351. # manual load and force to store the status
  352. start_all() {
  353.     echo -n "Starting sound driver"
  354.     load_modules && start_rest
  355.     # hack - in case the mixer isn't restored
  356.     # this shouldn't be needed anymore since udev cares
  357.     # (sleep 1; $alsactl -F -f $asoundcfg restore >/dev/null 2>&1)
  358.     rc_status
  359. }
  360.  
  361. terminate() {
  362.   #
  363.   # Kill processes holding open sound devices
  364.   #
  365.   fuser -k /dev/admmidi* /dev/adsp* /dev/amidi* /dev/audio* /dev/dmfm* \
  366.      /dev/dmmidi* /dev/dsp* /dev/dspW* /dev/midi* /dev/mixer* /dev/music \
  367.      /dev/patmgr* /dev/sequencer* /dev/sndstat >/dev/null 2>&1
  368.   if [ -d /dev/snd ]; then
  369.     fuser -k /dev/snd/* >/dev/null 2>&1
  370.   fi
  371.   #
  372.   # remove all sequencer connections if any
  373.   #
  374.   if [ -f /proc/asound/seq/clients -a -x $aconnect ]; then
  375.     $aconnect --removeall
  376.   fi
  377. }
  378.  
  379. # mute master to avoid clicks at unload/shutdown
  380. unmute_system() {
  381.   /usr/bin/amixer set Master mute >/dev/null 2>&1
  382. }
  383.  
  384. #
  385. # remove all sound modules
  386. #
  387. unload_modules() {
  388.   unmute_system
  389.   mod=$(grep -m1 -E '^(snd[^ ]*|ac97_bus) [0-9]+ 0' /proc/modules)
  390.   while [ -n "$mod" ]; do
  391.       mod=${mod%% *}
  392.       /sbin/modprobe -r $mod
  393.       mod=$(grep -m1 -E '^(snd[^ ]*|ac97_bus) [0-9]+ 0' /proc/modules)
  394.   done
  395.   rc_failed 0
  396. }
  397.  
  398. unload_all() {
  399.     echo -n "Shutting down sound driver"
  400.     terminate
  401.     unload_modules
  402.     rc_status -v
  403. }
  404.  
  405. stop_all() {
  406.     if [ -d /proc/asound ]; then
  407.     $alsactl -g -f $asoundcfg store
  408.         unload_all
  409.     fi
  410. }
  411.  
  412. # See how we were called.
  413. case "$1" in
  414.   start)
  415.     start_all
  416.     start_all_cards
  417.     rc_status
  418.         ;;
  419.   stop)
  420.     if [ "$RUNLEVEL" = "6" -o "$RUNLEVEL" = "0" ]; then
  421.         if [ -d /proc/asound ]; then
  422.         $alsactl -f $asoundcfg store
  423.         unmute_system
  424.         fi
  425.     else
  426.         stop_all
  427.     fi
  428.         ;;
  429.   unload)
  430.     test -d /proc/asound && unload_all
  431.     ;;
  432.   reload|restart)
  433.     stop_all
  434.     start_all
  435.     start_all_cards
  436.     ;;
  437.   status)
  438.         if [ -d /proc/asound ]; then
  439.           echo -n "ALSA sound driver loaded."
  440.           rc_status -v
  441.         else
  442.           echo -n "ALSA sound driver not loaded."
  443.       rc_status -u
  444.         fi
  445.         ;;
  446.   *)
  447.     echo "Usage: $0 {start|stop|restart|reload|unload|status}"
  448.         exit 1
  449.     ;;
  450. esac
  451.  
  452. rc_exit
  453.