The patch is applied right with /etc/init.d/alsa-utils file. I sending four files: 1. amixer-original.txt: My manual setted amixer volume values.2. amixer-after-restart.txt: after service alsa-utils restart command stored amixer control volume values
3. alsa-utils: the copy of patched /etc/init.d/alsa-utils file.4. sound.sh: a little bash script with easyest me the testing. Need running this file under /var/lib/alsa directory.
Attila
#!/bin/sh # # alsa-utils initscript # ### BEGIN INIT INFO # Provides: alsa-utils # Required-Start: $remote_fs udev # Required-Stop: $remote_fs # Default-Start: S # Default-Stop: 0 1 6 # Short-Description: Restore and store ALSA driver settings # Description: This script stores and restores mixer levels on # shutdown and bootup.On sysv-rc systems: to # disable storing of mixer levels on shutdown, # remove /etc/rc[06].d/K50alsa-utils. To disable # restoring of mixer levels on bootup, rename the # "S50alsa-utils" symbolic link in /etc/rcS.d/ to # "K50alsa-utils". ### END INIT INFO # Don't use set -e; check exit status instead # Exit silently if package is no longer installed [ -x /usr/sbin/alsactl ] || exit 0 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MYNAME=/etc/init.d/alsa-utils . /lib/lsb/init-functions # $1 EXITSTATUS # [$2 MESSAGE] log_action_end_msg_and_exit() { log_action_end_msg "$1" ${2:+"$2"} exit $1 } # $1 PROGRAM executable() { # If which is not available then we must be running before # /usr is mounted on a system that has which in /usr/bin/. # Conclude that $1 is not executable. [ -x /bin/which ] || [ -x /usr/bin/which ] || return 1 which "$1" >/dev/null 2>&1 } executable amixer || { echo "${MYNAME}: Error: No amixer program available." >&2 ; exit 1 ; } bugout() { echo "${MYNAME}: Programming error" >&2 ; exit 123 ; } # $1 <card ID> | "all" restore_levels() { [ -f /var/lib/alsa/asound.state ] || return 1 CARD="$1" [ "$1" = all ] && CARD="" # Assume that if alsactl prints a message on stderr # then it failed somehow. This works around the fact # that alsactl doesn't return nonzero status when it # can't restore settings for the card if MSG="$(alsactl restore $CARD 2>&1 >/dev/null)" && [ ! "$MSG" ] ; then return 0 else # Retry with the "force" option. This restores more levels # but it results in much longer error messages. alsactl -F restore $CARD >/dev/null 2>&1 log_action_cont_msg "warning: 'alsactl restore${CARD:+ $CARD}' failed with error message '$MSG'" return 1 fi } # $1 <card ID> | "all" store_levels() { CARD="$1" [ "$1" = all ] && CARD="" if MSG="$(alsactl store $CARD 2>&1)" ; then sleep 1 return 0 else log_action_cont_msg "warning: 'alsactl store${CARD:+ $CARD}' failed with error message '$MSG'" return 1 fi } echo_card_indices() { if [ -f /proc/asound/cards ] ; then sed -n -e's/^[[:space:]]*\([0-7]\)[[:space:]].*/\1/p' /proc/asound/cards fi } filter_amixer_output() { sed \ -e '/Unable to find simple control/d' \ -e '/Unknown playback setup/d' \ -e '/^$/d' } # The following functions try to set many controls. # No card has all the controls and so some of the attempts are bound to fail. # Because of this, the functions can't return useful status values. # $1 <control> # $2 <level> # $CARDOPT unmute_and_set_level() { { [ "$2" ] && [ "$CARDOPT" ] ; } || bugout amixer $CARDOPT -q set "$1" "$2" unmute 2>&1 | filter_amixer_output || : return 0 } # $1 <control> # $CARDOPT mute_and_zero_level() { { [ "$1" ] && [ "$CARDOPT" ] ; } || bugout amixer $CARDOPT -q set "$1" "0%" mute 2>&1 | filter_amixer_output || : return 0 } # $1 <control> # $2 "on" | "off" # $CARDOPT switch_control() { { [ "$2" ] && [ "$CARDOPT" ] ; } || bugout amixer $CARDOPT -q set "$1" "$2" 2>&1 | filter_amixer_output || : return 0 } # $1 <card ID> sanify_levels_on_card() { CARDOPT="-c $1" unmute_and_set_level "Master" "80%" unmute_and_set_level "Master Mono" "80%" # See Bug#406047 unmute_and_set_level "Master Digital" "80%" # E.g., cs4237B unmute_and_set_level "Playback" "80%" unmute_and_set_level "Headphone" "70%" unmute_and_set_level "PCM" "80%" unmute_and_set_level "PCM,1" "80%" # E.g., ess1969 unmute_and_set_level "DAC" "80%" # E.g., envy24, cs46xx unmute_and_set_level "DAC,0" "80%" # E.g., envy24 unmute_and_set_level "DAC,1" "80%" # E.g., envy24 unmute_and_set_level "Synth" "80%" unmute_and_set_level "CD" "80%" mute_and_zero_level "Mic" mute_and_zero_level "IEC958" # Ubuntu #19648 # Intel P4P800-MX (Ubuntu bug #5813) switch_control "Master Playback Switch" on switch_control "Master Surround" on # Trident/YMFPCI/emu10k1: unmute_and_set_level "Wave" "80%" unmute_and_set_level "Music" "80%" unmute_and_set_level "AC97" "80%" # DRC: unmute_and_set_level "Dynamic Range Compression" "80%" # Required for HDA Intel (hda-intel): unmute_and_set_level "Front" "80%" # Required for SB Live 7.1/24-bit (ca0106): unmute_and_set_level "Analog Front" "80%" # Required at least for Via 823x hardware on DFI K8M800-MLVF Motherboard with kernels 2.6.10-3/4 (see ubuntu #7286): switch_control "IEC958 Capture Monitor" off # Required for hardware allowing toggles for AC97 through IEC958, # valid values are 0, 1, 2, 3. Needs to be set to 0 for PCM1. unmute_and_set_level "IEC958 Playback AC97-SPSA" "0" # Required for newer Via hardware (see Ubuntu #31784) unmute_and_set_level "VIA DXS,0" "80%" unmute_and_set_level "VIA DXS,1" "80%" unmute_and_set_level "VIA DXS,2" "80%" unmute_and_set_level "VIA DXS,3" "80%" # Required on some notebooks with ICH4: switch_control "Headphone Jack Sense" off switch_control "Line Jack Sense" off # Some machines need one or more of these to be on; # others need one or more of these to be off: # # switch_control "External Amplifier" on switch_control "Audigy Analog/Digital Output Jack" on switch_control "SB Live Analog/Digital Output Jack" on # D1984 -- Thinkpad T61/X61 switch_control "Speaker" on switch_control "Headphone" on # HDA-Intel w/ "Digital" capture mixer (See Ubuntu #193823) unmute_and_set_level "Digital" "80%" # On MacBookPro5,3 and later models (See Bug#597791) unmute_and_set_level "Front Speaker" "80%" # On Intel 82801H (See Bug#603550) unmute_and_set_level "Speaker" "80%" unmute_and_set_level "Capture" "100%" unmute_and_set_level "Mic Boost" "50%" unmute_and_set_level "Front Mic Boost" "50%" return 0 } # $1 <card ID> | "all" sanify_levels() { TTSDML_RETURNSTATUS=0 case "$1" in all) for CARD in $(echo_card_indices) ; do sanify_levels_on_card "$CARD" || TTSDML_RETURNSTATUS=1 done ;; *) sanify_levels_on_card "$1" || TTSDML_RETURNSTATUS=1 ;; esac return $TTSDML_RETURNSTATUS } # $1 <card ID> preinit_levels_on_card() { CARDOPT="-c $1" # Silly dance to activate internal speakers by default on PowerMac # Snapper and Tumbler id=`cat /proc/asound/card$1/id 2>/dev/null` if [ "$id" = "Snapper" -o "$id" = "Tumbler" ]; then switch_control "Auto Mute" off switch_control "PC Speaker" off switch_control "Auto Mute" on fi } # $1 <card ID> | "all" preinit_levels() { TTSDML_RETURNSTATUS=0 case "$1" in all) for CARD in $(echo_card_indices) ; do preinit_levels_on_card "$CARD" || TTSDML_RETURNSTATUS=1 done ;; *) preinit_levels_on_card "$1" || TTSDML_RETURNSTATUS=1 ;; esac return $TTSDML_RETURNSTATUS } # $1 <card ID> mute_and_zero_levels_on_card() { CARDOPT="-c $1" for CTL in \ Master \ PCM \ Synth \ CD \ Line \ Mic \ "PCM,1" \ Wave \ Music \ AC97 \ "Master Digital" \ DAC \ "DAC,0" \ "DAC,1" \ Headphone \ Speaker \ Playback do mute_and_zero_level "$CTL" done # for CTL in \ # "Audigy Analog/Digital Output Jack" \ # "SB Live Analog/Digital Output Jack" # do # switch_control "$CTL" off # done return 0 } # $1 <card ID> | "all" mute_and_zero_levels() { TTZML_RETURNSTATUS=0 case "$1" in all) for CARD in $(echo_card_indices) ; do mute_and_zero_levels_on_card "$CARD" || TTZML_RETURNSTATUS=1 done ;; *) mute_and_zero_levels_on_card "$1" || TTZML_RETURNSTATUS=1 ;; esac return $TTZML_RETURNSTATUS } # $1 <card ID> | "all" card_OK() { [ "$1" ] || bugout if [ "$1" = all ] ; then [ -d /proc/asound ] return $? else [ -d "/proc/asound/card$1" ] || [ -d "/proc/asound/$1" ] return $? fi } # If a card identifier is provided in $2 then regard it as an error # if that card is not present; otherwise don't regard it as an error. case "$1" in start) EXITSTATUS=0 TARGET_CARD="$2" case "$TARGET_CARD" in ""|all) TARGET_CARD=all ; log_action_begin_msg "Setting up ALSA" ;; *) log_action_begin_msg "Setting up ALSA card ${TARGET_CARD}" ;; esac card_OK "$TARGET_CARD" || log_action_end_msg_and_exit "$( [ ! "$2" ] ; echo $? ; )" "none loaded" preinit_levels "$TARGET_CARD" || EXITSTATUS=1 if ! restore_levels "$TARGET_CARD" ; then sanify_levels "$TARGET_CARD" || EXITSTATUS=1 restore_levels "$TARGET_CARD" >/dev/null 2>&1 || : fi log_action_end_msg_and_exit "$EXITSTATUS" ;; stop) EXITSTATUS=0 TARGET_CARD="$2" case "$TARGET_CARD" in ""|all) TARGET_CARD=all ; log_action_begin_msg "Shutting down ALSA" ;; *) log_action_begin_msg "Shutting down ALSA card ${TARGET_CARD}" ;; esac card_OK "$TARGET_CARD" || log_action_end_msg_and_exit "$( [ ! "$2" ] ; echo $? ; )" "none loaded" store_levels "$TARGET_CARD" || EXITSTATUS=1 #mute_and_zero_levels "$TARGET_CARD" || EXITSTATUS=1 log_action_end_msg_and_exit "$EXITSTATUS" ;; restart|force-reload) EXITSTATUS=0 $0 stop || EXITSTATUS=1 $0 start || EXITSTATUS=1 exit $EXITSTATUS ;; reset) TARGET_CARD="$2" case "$TARGET_CARD" in ""|all) TARGET_CARD=all ; log_action_begin_msg "Resetting ALSA" ;; *) log_action_begin_msg "Resetting ALSA card ${TARGET_CARD}" ;; esac card_OK "$TARGET_CARD" || log_action_end_msg_and_exit "$( [ ! "$2" ] ; echo $? ; )" "none loaded" preinit_levels "$TARGET_CARD" sanify_levels "$TARGET_CARD" log_action_end_msg_and_exit "$?" ;; *) echo "Usage: $MYNAME {start [CARD]|stop [CARD]|restart [CARD]|reset [CARD]}" >&2 exit 3 ;; esac
Simple mixer control 'Master',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined penum Playback channels: Mono Limits: Playback 0 - 64 Mono: Playback 44 [69%] [-20.00dB] [on] Simple mixer control 'Headphone',0 Capabilities: pvolume pswitch penum Playback channels: Front Left - Front Right Limits: Playback 0 - 64 Mono: Front Left: Playback 64 [100%] [0.00dB] [on] Front Right: Playback 64 [100%] [0.00dB] [on] Simple mixer control 'Speaker',0 Capabilities: pvolume pswitch penum Playback channels: Front Left - Front Right Limits: Playback 0 - 64 Mono: Front Left: Playback 0 [0%] [-64.00dB] [on] Front Right: Playback 0 [0%] [-64.00dB] [on] Simple mixer control 'PCM',0 Capabilities: pvolume penum Playback channels: Front Left - Front Right Limits: Playback 0 - 255 Mono: Front Left: Playback 254 [100%] [0.20dB] Front Right: Playback 254 [100%] [0.20dB] Simple mixer control 'Front Mic Boost',0 Capabilities: volume penum Playback channels: Front Left - Front Right Capture channels: Front Left - Front Right Limits: 0 - 2 Front Left: 0 [0%] Front Right: 0 [0%] Simple mixer control 'Mic Boost',0 Capabilities: volume penum Playback channels: Front Left - Front Right Capture channels: Front Left - Front Right Limits: 0 - 2 Front Left: 0 [0%] Front Right: 0 [0%] Simple mixer control 'Beep',0 Capabilities: pvolume pswitch penum Playback channels: Front Left - Front Right Limits: Playback 0 - 12 Mono: Front Left: Playback 0 [0%] [-24.00dB] [off] Front Right: Playback 0 [0%] [-24.00dB] [off] Simple mixer control 'Capture',0 Capabilities: cvolume cswitch penum Capture channels: Front Left - Front Right Limits: Capture 0 - 31 Front Left: Capture 0 [0%] [-16.50dB] [on] Front Right: Capture 0 [0%] [-16.50dB] [on] Simple mixer control 'Digital',0 Capabilities: cvolume penum Capture channels: Front Left - Front Right Limits: Capture 0 - 120 Front Left: Capture 60 [50%] [0.00dB] Front Right: Capture 60 [50%] [0.00dB]
Simple mixer control 'Master',0 Capabilities: pvolume pvolume-joined pswitch pswitch-joined penum Playback channels: Mono Limits: Playback 0 - 64 Mono: Playback 44 [69%] [-20.00dB] [on] Simple mixer control 'Headphone',0 Capabilities: pvolume pswitch penum Playback channels: Front Left - Front Right Limits: Playback 0 - 64 Mono: Front Left: Playback 64 [100%] [0.00dB] [on] Front Right: Playback 64 [100%] [0.00dB] [on] Simple mixer control 'Speaker',0 Capabilities: pvolume pswitch penum Playback channels: Front Left - Front Right Limits: Playback 0 - 64 Mono: Front Left: Playback 64 [100%] [0.00dB] [on] Front Right: Playback 64 [100%] [0.00dB] [on] Simple mixer control 'PCM',0 Capabilities: pvolume penum Playback channels: Front Left - Front Right Limits: Playback 0 - 255 Mono: Front Left: Playback 254 [100%] [0.20dB] Front Right: Playback 254 [100%] [0.20dB] Simple mixer control 'Front Mic Boost',0 Capabilities: volume penum Playback channels: Front Left - Front Right Capture channels: Front Left - Front Right Limits: 0 - 2 Front Left: 1 [50%] Front Right: 1 [50%] Simple mixer control 'Mic Boost',0 Capabilities: volume penum Playback channels: Front Left - Front Right Capture channels: Front Left - Front Right Limits: 0 - 2 Front Left: 1 [50%] Front Right: 1 [50%] Simple mixer control 'Beep',0 Capabilities: pvolume pswitch penum Playback channels: Front Left - Front Right Limits: Playback 0 - 12 Mono: Front Left: Playback 0 [0%] [-24.00dB] [off] Front Right: Playback 0 [0%] [-24.00dB] [off] Simple mixer control 'Capture',0 Capabilities: cvolume cswitch penum Capture channels: Front Left - Front Right Limits: Capture 0 - 31 Front Left: Capture 31 [100%] [30.00dB] [on] Front Right: Capture 31 [100%] [30.00dB] [on] Simple mixer control 'Digital',0 Capabilities: cvolume penum Capture channels: Front Left - Front Right Limits: Capture 0 - 120 Front Left: Capture 60 [50%] [0.00dB] Front Right: Capture 60 [50%] [0.00dB]
sound.sh
Description: Bourne shell script