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:
Christos Margiolis
2025-09-28 11:56:52 +02:00
parent f34e1c76ad
commit 9cab9fde5e
51 changed files with 12547 additions and 1 deletions
+1
View File
@@ -75,6 +75,7 @@ CONFS= DAEMON \
ugidfw \
var \
var_run \
virtual_oss \
watchdogd
CONFGROUPS+= DEVD
+119
View File
@@ -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 "$@"