xref: /freebsd/libexec/rc/rc.d/virtual_oss (revision a3cefe7f2b4df0f70ff92d4570ce18e517af43ec)
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
25configs=
26pidpath="/var/run/${name}"
27default_unit=$(sysctl -n hw.snd.default_unit 2> /dev/null)
28
29# Default configuration's control device.
30: "${virtual_oss_default_control_device:="vdsp.ctl"}"
31
32virtual_oss_default_args="\
33	-S \
34	-C 2 \
35	-c 2 \
36	-r 48000 \
37	-b 24 \
38	-s 8ms \
39	-i 8 \
40	-f /dev/dsp${default_unit} \
41	-d dsp \
42	-t ${virtual_oss_default_control_device}"
43
44# Set to NO by default. Set it to "YES" to enable virtual_oss.
45: "${virtual_oss_enable:="NO"}"
46
47#  List of configurations to use. Default is "dsp".
48: "${virtual_oss_configs:="dsp"}"
49
50# Default (dsp) virtual_oss config.
51: "${virtual_oss_dsp:="${virtual_oss_default_args}"}"
52
53virtual_oss_pids()
54{
55	pids=$(pgrep -d ' ' ${name})
56	pids=${pids% }
57	printf '%s\n' "${pids}"
58}
59
60virtual_oss_precmd()
61{
62	/usr/bin/install -d -m 0755 -o root "${pidpath}"
63}
64
65start_instance()
66{
67	config="$1"
68	instance_args=$(eval "echo \$virtual_oss_${config}")
69	if [ -z "${instance_args}" ]; then
70		warn "no such config: ${config}"
71	else
72		startmsg -n "Starting virtual_oss config: ${config}: "
73		${command} \
74			${command_args} \
75			-D "${pidpath}/${config}.pid" \
76			${instance_args}
77		startmsg "done"
78	fi
79}
80
81stop_instance()
82{
83	config="$1"
84	instance_args=$(eval "echo \$virtual_oss_${config}")
85	if [ -z "${instance_args}" ]; then
86		warn "no such config: ${config}"
87	else
88		startmsg -n "Stopping virtual_oss config: ${config}: "
89		kill "$(cat "${pidpath}/${config}.pid")"
90		rm -f "${pidpath}/${config}.pid"
91		startmsg "done"
92	fi
93}
94
95virtual_oss_start()
96{
97	configs="$1"
98	[ -z "${configs}" ] && configs="${virtual_oss_configs}"
99	for config in ${configs}; do
100		start_instance "${config}"
101	done
102}
103
104virtual_oss_stop()
105{
106	configs="$1"
107	[ -z "${configs}" ] && configs="${virtual_oss_configs}"
108	for config in ${configs}; do
109		stop_instance "${config}"
110	done
111}
112
113virtual_oss_status()
114{
115	pids=$(virtual_oss_pids)
116
117	if [ "${pids}" ]; then
118		echo "${name} is running as pid ${pids}."
119	else
120		echo "${name} is not running."
121		return 1
122	fi
123}
124
125run_rc_command "$@"
126