summaryrefslogtreecommitdiff
path: root/audio/virtual_oss/files/virtual_oss.in
blob: 94dfe8b7a01b541d1be5217b698c6f0aab87b76e (plain) (blame)
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/bin/sh

# PROVIDE: virtual_oss
# REQUIRE: kld ldconfig
# BEFORE: LOGIN sndiod
# KEYWORD: shutdown

#
# Add the following lines to /etc/rc.conf.local, /etc/rc.conf or
# /etc/rc.conf.d/virtual_oss to enable this service:
#
# virtual_oss_enable (bool):    Set to NO by default.
#                               Set it to "YES" to enable virtual_oss.
# virtual_oss_configs (string): List of configurations to use
#                               Default is "dsp"
# virtual_oss_dsp (string):     Arguments passed to virtual_oss config named dsp
#                               Default is
#                                   -C 2 -c 2 # use two channels
#                                   -S # resample if needed
#                                   -i 8 # real-time priority
#                                   -r 48000 # sample rate
#                                   -b 24 # bit depth
#                                   -s 8.0ms # buffer delay
#                                   -f /dev/dsp0 # hardware device to use
#                                   -d dsp # vdev to create
#                                   -t dsp.ctl # control device

. /etc/rc.subr

name=virtual_oss
desc="Virtual OSS device manager"
rcvar=${name}_enable
start_precmd="${name}_precmd"
start_cmd="${name}_start"
stop_cmd="${name}_stop"
status_cmd="${name}_status"

required_modules="cuse"
virtual_oss_default_args="\
	-S \
	-i 8 \
	-C 2 -c 2 \
	-r 48000 \
	-b 24 \
	-s 8.0ms \
	-f /dev/dsp0 \
	-c 2 \
	-d dsp \
	-t dsp.ctl"
configs=

load_rc_config $name

: ${virtual_oss_enable:="NO"}
: ${virtual_oss_configs:="dsp"}
: ${virtual_oss_dsp:="$virtual_oss_default_args"}
: ${virtual_oss_delay:=1}

command=virtual_oss
command_args="-B"

pidpath="/var/run/${name}"

virtual_oss()
{
	# When running early we need to pre-load some libraries
	env LD_PRELOAD=%%LIBFFTW3%%%%LIBSAMPLERATE%% %%PREFIX%%/sbin/virtual_oss $*
}

virtual_oss_pids()
{
	pids=$(pgrep -d ' ' $name)
	pids=${pids% }
	printf "${pids}"
}

virtual_oss_precmd()
{
	/usr/bin/install -d -m 0755 -o root ${pidpath}
}

start_instance()
{
	config=$*
	instance_args=$(eval "echo \$virtual_oss_${config}")
	if [ -z "${instance_args}" ]; then
		echo "No such config ${config}"
	else
		echo -n "Starting Virtual OSS config ${config} ..."
		${command} \
			${command_args} \
			-D ${pidpath}/${config}.pid \
			${instance_args}
		echo " done"
	fi
}

stop_instance()
{
	config=$*
	instance_args=`eval "echo \$virtual_oss_${config}"`
	if [ -z "${instance_args}" ]; then
		echo "No such config ${config}"
	elif [ -e "${pidpath}/${config}.pid" ]; then
		pid=`check_pidfile ${pidpath}/${config}.pid %%PREFIX%%/sbin/virtual_oss`
		if [ ! -z "${pid}" ]; then
			echo -n "Stopping Virtual OSS config ${config} ... "
			kill $pid
			rm -f ${pidpath}/${config}.pid
			echo "done"
		fi
	fi
}

virtual_oss_start()
{
	configs=$*
	[ -z "${configs}" ] && configs="${virtual_oss_configs}"
	for config in ${configs}; do
		start_instance $config
		sleep ${virtual_oss_delay}
	done
}

virtual_oss_stop()
{
	configs=$*
	[ -z "${configs}" ] && configs="${virtual_oss_configs}"
	for config in ${configs}; do
		stop_instance ${config}
		sleep ${virtual_oss_delay}
	done
}

virtual_oss_status()
{
	pids=$(virtual_oss_pids)

	if [ "${pids}" ]; then
		echo "${name} is running as pid ${pids}."
	else
		echo "${name} is not running."
		return 1
	fi
}

run_rc_command $*