aboutsummaryrefslogtreecommitdiff
path: root/libexec/rc/rc.d/virtual_oss
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/rc/rc.d/virtual_oss')
-rw-r--r--libexec/rc/rc.d/virtual_oss119
1 files changed, 119 insertions, 0 deletions
diff --git a/libexec/rc/rc.d/virtual_oss b/libexec/rc/rc.d/virtual_oss
new file mode 100644
index 000000000000..4f5c34ce03f3
--- /dev/null
+++ b/libexec/rc/rc.d/virtual_oss
@@ -0,0 +1,119 @@
+#!/bin/sh
+
+# PROVIDE: virtual_oss
+# REQUIRE: kld ldconfig
+# BEFORE: LOGIN sndiod
+# KEYWORD: shutdown
+
+. /etc/rc.subr
+
+name="virtual_oss"
+desc="virtual_oss device manager"
+rcvar="${name}_enable"
+
+command="/usr/sbin/${name}"
+command_args="-B"
+
+load_rc_config "$name"
+start_precmd="${name}_precmd"
+start_cmd="${name}_start"
+stop_cmd="${name}_stop"
+status_cmd="${name}_status"
+
+configs=
+pidpath="/var/run/${name}"
+virtual_oss_default_args="\
+ -S \
+ -C 2 \
+ -c 2 \
+ -r 48000 \
+ -b 24 \
+ -s 8ms \
+ -i 8 \
+ -f /dev/dsp \
+ -d dsp \
+ -t vdsp.ctl"
+
+# Set to NO by default. Set it to "YES" to enable virtual_oss.
+: "${virtual_oss_enable:="NO"}"
+
+# List of configurations to use. Default is "dsp".
+: "${virtual_oss_configs:="dsp"}"
+
+# Default (dsp) virtual_oss config.
+: "${virtual_oss_dsp:="${virtual_oss_default_args}"}"
+
+virtual_oss_pids()
+{
+ pids=$(pgrep -d ' ' ${name})
+ pids=${pids% }
+ printf '%s\n' "${pids}"
+}
+
+virtual_oss_precmd()
+{
+ /usr/bin/install -d -m 0755 -o root "${pidpath}"
+ load_kld cuse
+}
+
+start_instance()
+{
+ config="$1"
+ instance_args=$(eval "echo \$virtual_oss_${config}")
+ if [ -z "${instance_args}" ]; then
+ warn "no such config: ${config}"
+ else
+ startmsg -n "Starting virtual_oss config: ${config}: "
+ ${command} \
+ ${command_args} \
+ -D "${pidpath}/${config}.pid" \
+ ${instance_args}
+ startmsg "done"
+ fi
+}
+
+stop_instance()
+{
+ config="$1"
+ instance_args=$(eval "echo \$virtual_oss_${config}")
+ if [ -z "${instance_args}" ]; then
+ warn "no such config: ${config}"
+ else
+ startmsg -n "Stopping virtual_oss config: ${config}: "
+ kill "$(cat "${pidpath}/${config}.pid")"
+ rm -f "${pidpath}/${config}.pid"
+ startmsg "done"
+ fi
+}
+
+virtual_oss_start()
+{
+ configs="$1"
+ [ -z "${configs}" ] && configs="${virtual_oss_configs}"
+ for config in ${configs}; do
+ start_instance "${config}"
+ done
+}
+
+virtual_oss_stop()
+{
+ configs="$1"
+ [ -z "${configs}" ] && configs="${virtual_oss_configs}"
+ for config in ${configs}; do
+ stop_instance "${config}"
+ 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 "$@"