3
# alsa-base control script
5
# Description: Used to load and unload ALSA modules and
6
# restore and store mixer levels. There is no
7
# longer any need to run this script on bootup
8
# or shutdown. It is now moved to /usr/sbin.
12
# Exit if alsa-base package is not installed
13
[ -f /etc/modprobe.d/alsa-base.conf ] || exit 0
16
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
18
# Default values of variables in /etc/default/alsa
19
force_unload_modules_before_suspend=""
21
[ -f /etc/default/alsa ] && . /etc/default/alsa
24
warn() { echo "${MYNAME}: Warning: $* " >&2 ; }
27
# Attempt to create /var/run/alsa if it is absent.
28
# Return true if /var/run/alsa exists after this attempt,
33
[ -d /var/run/alsa ] && return 0
34
# We have no business creating /var/run if it doesn't exist
35
if ! [ -d /var/run ] ; then
36
warn "Could not create /var/run/alsa/ because /var/run/ is not present."
39
if ! mkdir --mode=755 /var/run/alsa ; then
40
warn "Failed to create /var/run/alsa/."
43
[ -d /var/run/alsa ] && return 0
47
echo_procs_using_sound()
49
for i in /proc/[0-9]*/fd/* ; do
51
if test x"$var" != x"${var#/dev/snd/pcm}" ; then
52
IFS=/; set -- $i; unset IFS; echo $3
58
echo_with_command_names()
62
ps --no-headers -o "%p %c" "$@" \
63
| sed -e 's/\([0-9][0-9]*\) \(.*\)/\1(\2)/' \
67
kill_procs_using_sound()
69
procs_using_sound="$(echo_procs_using_sound)"
70
if [ "$procs_using_sound" ] ; then
71
echo -n "Terminating processes:"
72
for attempt in 1 2 3 4 ; do
73
echo -n " ${procs_using_sound}"
74
kill $procs_using_sound || :
76
procs_using_sound="$(echo_procs_using_sound)"
77
[ "$procs_using_sound" ] || break
79
# Either no more procs using sound or attempts ran out
80
if [ "$procs_using_sound" ] ; then
81
echo -n " (with SIGKILL:) ${procs_using_sound}"
82
kill -9 $procs_using_sound || :
85
procs_using_sound="$(echo_procs_using_sound)"
86
if [ "$procs_using_sound" ] ; then
87
echo " (failed: processes still using sound devices: $(echo_with_command_names $procs_using_sound))."
95
# $* MODULE-NAME [MODULE-NAME]... | "all"
98
procs_using_sound="$(echo_procs_using_sound)"
99
if [ "$procs_using_sound" ] ; then
100
warn "Processes using sound devices: $(echo_with_command_names $procs_using_sound)."
102
if check_run_dir ; then
103
:> /var/run/alsa/modules-removed
105
warn "Not keeping list of removed modules because /var/run/alsa is absent.
106
It will not be possible automatically to reload these modules."
108
echo -n "Unloading ALSA sound driver modules:"
109
[ -d /proc/asound ] || { echo " (none loaded)." ; return 0 ; }
110
echo_snd_modules_loaded()
113
| sed -n -e 's/^\(snd[-_][^[:space:]]*\)[[:space:]].*/\1/p' \
118
SND_MODULES_LOADED="$(echo_snd_modules_loaded)"
121
MODULES_TO_REMOVE="$SND_MODULES_LOADED"
124
FSMBS="$(echo "$FSMBS" | sed -e 's/_/-/g')"
125
for M in $SND_MODULES_LOADED ; do
126
if [ "$FSMBS" = "$M" ] ; then
127
MODULES_TO_REMOVE="$FSMBS"
133
[ "$MODULES_TO_REMOVE" ] || continue
134
if [ -d /var/run/alsa ] ; then
135
echo "$MODULES_TO_REMOVE" >> /var/run/alsa/modules-removed
137
for M in $MODULES_TO_REMOVE ; do
139
modprobe -r "$M" >/dev/null 2>&1 || :
142
if [ -f /var/run/alsa/modules-removed ] ; then
143
MODULES_STILL_LOADED="$(echo_snd_modules_loaded | grep -F -f /var/run/alsa/modules-removed)"
144
MODULES_STILL_LOADED="$(echo $MODULES_STILL_LOADED)"
146
MODULES_STILL_LOADED=""
148
if [ "$MODULES_STILL_LOADED" ] ; then
149
echo " (failed: modules still loaded: ${MODULES_STILL_LOADED})."
157
# $* MODULE-NAME [MODULE-NAME]... | "all"
158
force_unload_modules()
160
kill_procs_using_sound || :
161
unload_modules "$@" || return 1
165
load_unloaded_modules()
169
[ -d /var/run/alsa ] || warn "Directory /var/run/alsa is absent."
170
echo -n "Loading ALSA sound driver modules:"
171
[ -f /var/run/alsa/modules-removed ] && MODULES_TO_LOAD="$(echo $(cat /var/run/alsa/modules-removed))"
172
[ "$MODULES_TO_LOAD" ] || { echo " (none to reload)." ; return $LUM_RETURNSTATUS ; }
173
echo -n " $MODULES_TO_LOAD"
174
for MDL in $MODULES_TO_LOAD ; do
175
modprobe $MDL || LUM_RETURNSTATUS=1
177
case "$LUM_RETURNSTATUS" in
179
*) echo " (failed)." ;;
181
return $LUM_RETURNSTATUS
186
unload_modules all || exit $?
190
unload_modules all || EXITSTATUS=1
191
load_unloaded_modules || EXITSTATUS=1
195
force_unload_modules all || exit $?
199
force_unload_modules all || EXITSTATUS=1
200
load_unloaded_modules || EXITSTATUS=1
204
case "$force_unload_modules_before_suspend" in
206
all|true) force_unload_modules all || exit $? ;;
207
*) force_unload_modules $force_unload_modules_before_suspend || exit $? ;;
211
case "$force_unload_modules_before_suspend" in
213
*) load_unloaded_modules || exit $? ;;
217
echo "Usage: $MYNAME {unload|reload|force-unload|force-reload|suspend|resume}" >&2