xref: /freebsd/libexec/rc/rc.d/virtual_oss (revision b2677d002edbe9308b1f8cecd1a5fc515d2a5deb)
1#!/bin/sh
2
3# PROVIDE: virtual_oss
4# REQUIRE: NETWORKING kld ldconfig
5# BEFORE: LOGIN
6# KEYWORD: shutdown
7
8. /etc/rc.subr
9
10name="virtual_oss"
11desc="virtual_oss device manager"
12rcvar="${name}_enable"
13
14command="/usr/sbin/${name}"
15command_args="-B"
16
17load_rc_config "$name"
18start_precmd="${name}_precmd"
19start_cmd="${name}_start"
20stop_cmd="${name}_stop"
21status_cmd="${name}_status"
22
23required_modules="cuse"
24
25pidpath="/var/run/${name}"
26
27default_unit=$(sysctl -n hw.snd.default_unit 2> /dev/null)
28virtual_oss_default_args="\
29	-S \
30	-C 2 \
31	-c 2 \
32	-r 48000 \
33	-b 24 \
34	-s 8ms \
35	-i 8 \
36	-f /dev/dsp${default_unit} \
37	-d dsp \
38	-l dsp.loop \
39	-t ${virtual_oss_default_control_device}"
40
41# Default (dsp) virtual_oss config.
42: "${virtual_oss_dsp:="${virtual_oss_default_args}"}"
43
44virtual_oss_pids()
45{
46	pids=$(pgrep -d ' ' ${name})
47	pids=${pids% }
48	printf '%s\n' "${pids}"
49}
50
51virtual_oss_precmd()
52{
53	/usr/bin/install -d -m 0755 -o root "${pidpath}"
54}
55
56start_instance()
57{
58	config="$1"
59	instance_args=$(eval "echo \$virtual_oss_${config}")
60	if [ -z "${instance_args}" ]; then
61		warn "no such config: ${config}"
62	else
63		startmsg -n "Starting virtual_oss config: ${config}: "
64		${command} \
65			${command_args} \
66			-D "${pidpath}/${config}.pid" \
67			${instance_args}
68		startmsg "done"
69	fi
70}
71
72stop_instance()
73{
74	config="$1"
75	instance_args=$(eval "echo \$virtual_oss_${config}")
76	if [ -z "${instance_args}" ]; then
77		warn "no such config: ${config}"
78	else
79		pidfile="${pidpath}/${config}.pid"
80		if [ ! -f "${pidfile}" ]; then
81			warn "not running: ${config}"
82		else
83			pid="$(cat "${pidfile}")"
84			startmsg -n "Stopping virtual_oss config: ${config}: "
85			kill "${pid}"
86			pwait "${pid}"
87			rm -f "${pidfile}"
88			startmsg "done"
89		fi
90	fi
91}
92
93virtual_oss_start()
94{
95	configs="$1"
96	[ -z "${configs}" ] && configs="${virtual_oss_configs}"
97	for config in ${configs}; do
98		start_instance "${config}"
99	done
100}
101
102virtual_oss_stop()
103{
104	configs="$1"
105	[ -z "${configs}" ] && configs="${virtual_oss_configs}"
106	for config in ${configs}; do
107		stop_instance "${config}"
108	done
109}
110
111virtual_oss_status()
112{
113	pids=$(virtual_oss_pids)
114
115	if [ "${pids}" ]; then
116		echo "${name} is running as pid ${pids}."
117	else
118		echo "${name} is not running."
119		return 1
120	fi
121}
122
123run_rc_command "$@"
124