virtual_oss: Port to base
This patch diverges quite a bit from the current upstream [1] in a few ways: 1. virtual_oss(8), virtual_bt_speaker(8) and virtual_oss_cmd(8) are actually separate programs. 2. Backends (lib/virtual_oss) are built as separate shared libraries and we dlopen() them in virtual_oss(8) and virtual_bt_speaker(8) on demand. 3. virtual_equalizer(8) and the sndio and bluetooth backends are built as ports, because they depend on third-party libraries. 4. Use newer libav API in bluetooth backend (see HAVE_LIBAV ifdefs) to address compiler errors. [1] https://github.com/freebsd/virtual_oss Sponsored by: The FreeBSD Foundation MFC after: 1 week Reviewed by: emaste Differential Revision: https://reviews.freebsd.org/D52308
This commit is contained in:
@@ -75,6 +75,7 @@ CONFS= DAEMON \
|
||||
ugidfw \
|
||||
var \
|
||||
var_run \
|
||||
virtual_oss \
|
||||
watchdogd
|
||||
|
||||
CONFGROUPS+= DEVD
|
||||
|
||||
@@ -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 "$@"
|
||||
Reference in New Issue
Block a user