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