summaryrefslogtreecommitdiff
blob: 2fe2347c3773b8c8325e7a8986b30ba2b54ef100 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#!/sbin/openrc-run
# Copyright 1999-2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

alsastatedir=/var/lib/alsa
alsascrdir=/etc/alsa.d
alsahomedir=/run/alsasound

extra_commands="save restore"

depend() {
	need localmount
	after bootmisc modules isapnp coldplug hotplug
}

restore() {
	ebegin "Restoring Mixer Levels"

	checkpath -q -d -m 0700 -o root:root ${alsahomedir} || return 1

	if [ ! -r "${alsastatedir}/asound.state" ] ; then
		ewarn "No mixer config in ${alsastatedir}/asound.state, you have to unmute your card!"
		eend 0
		return 0
	fi

	local cards="$(sed -n -e 's/^ *\([[:digit:]]*\) .*/\1/p' /proc/asound/cards)"
	local CARDNUM
	for cardnum in ${cards}; do
		[ -e /dev/snd/controlC${cardnum} ] || sleep 2
		[ -e /dev/snd/controlC${cardnum} ] || sleep 2
		[ -e /dev/snd/controlC${cardnum} ] || sleep 2
		[ -e /dev/snd/controlC${cardnum} ] || sleep 2
		alsactl -E HOME="${alsahomedir}" -I -f "${alsastatedir}/asound.state" restore ${cardnum} \
			|| ewarn "Errors while restoring defaults, ignoring"
	done

	for ossfile in "${alsastatedir}"/oss/card*_pcm* ; do
		[ -e "${ossfile}" ] || continue
		# We use cat because I'm not sure if cp works properly on /proc
		local procfile=${ossfile##${alsastatedir}/oss}
		procfile="$(echo "${procfile}" | sed -e 's,_,/,g')"
		if [ -e /proc/asound/"${procfile}"/oss ] ; then
		    cat "${ossfile}" > /proc/asound/"${procfile}"/oss 
		fi
	done

	eend 0
}

save() {
	ebegin "Storing ALSA Mixer Levels"

	checkpath -q -d -m 0700 -o root:root ${alsahomedir} || return 1

	mkdir -p "${alsastatedir}"
	if ! alsactl -E HOME="${alsahomedir}" -f "${alsastatedir}/asound.state" store; then
		eerror "Error saving levels."
		eend 1
		return 1
	fi

	for ossfile in /proc/asound/card*/pcm*/oss; do
		[ -e "${ossfile}" ] || continue
		local device=${ossfile##/proc/asound/} ; device=${device%%/oss}
		device="$(echo "${device}" | sed -e 's,/,_,g')"
		mkdir -p "${alsastatedir}/oss/"
		cp "${ossfile}" "${alsastatedir}/oss/${device}"
	done

	eend 0
}

start() {
	if [ "${RESTORE_ON_START}" = "yes" ]; then
		restore
	fi

	return 0
}

stop() {
	if [ "${SAVE_ON_STOP}" = "yes" ]; then
		save
	fi
	return 0
}