Skip to content

Commit

Permalink
audio/jack: Remove obsolete realtime hack for RC service, with checks
Browse files Browse the repository at this point in the history
PR:		276607
  • Loading branch information
0EVSG authored and yurivict committed Feb 11, 2024
1 parent 46b4854 commit 100a985
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 12 deletions.
2 changes: 1 addition & 1 deletion audio/jack/Makefile
@@ -1,7 +1,7 @@
PORTNAME= jackit
DISTVERSIONPREFIX= v
DISTVERSION= 1.9.22
PORTREVISION= 1
PORTREVISION= 2
CATEGORIES= audio

MAINTAINER= dev@submerge.ch
Expand Down
43 changes: 36 additions & 7 deletions audio/jack/files/jackd.in
Expand Up @@ -11,7 +11,7 @@
: ${jackd_enable="NO"}
: ${jackd_user="root"}
: ${jackd_rtprio="NO"}
: ${jackd_args="-r -doss -r44100 -p1024 -n3 -w16"}
: ${jackd_args="--no-realtime -doss -r48000 -p1024 -w32"}

. /etc/rc.subr

Expand All @@ -20,15 +20,44 @@ rcvar=jackd_enable
procname=%%PREFIX%%/bin/jackd
start_cmd="start_jackd"

fail() {
echo "JACK failed to start: $1" >&2
exit 1
}

check_config() {
# check that jackd_user is set
if [ -z "$jackd_user" ]; then
fail "jackd_user has to be defined"
fi

# detect intent to use realtime priority
if [ "$jackd_rtprio" = "YES" ] || \
{ echo "$jackd_args" | grep -q -- "oss" && \
{ echo "$jackd_args" | grep -qw -- "--realtime" || \
echo "$jackd_args" | grep -qw -- "-[A-Za-mo-z]*R[A-Za-z]*"; }; }; then
# check that mac_priority(4) is enabled
if [ "$(sysctl -qn security.mac.priority.realtime)" != "1" ]; then
fail "Realtime priority requires mac_priority(4) to be loaded"
fi
# check that the user has realtime privileges
if ! (su -m "$jackd_user" -c "rtprio 10 test -z"); then
fail "User jackd_user=$jackd_user is not a member of the realtime group"
fi
fi
}

start_jackd() {
echo "Starting ${name}."
if [ $jackd_rtprio = "YES" ]; then
local rt="rtprio 1"
fi

# check that setup is valid
check_config

# log the date and parameters
echo -e "\n[`date`] Starting the daemon, user=$jackd_user rtprio=$jackd_rtprio args=\"$jackd_args\"" >> /var/log/${name}.log
# daemon(8) should be able to set the realtime priority, but it isn't
$rt daemon -p /var/run/${name}.pid -u "${jackd_user}" %%PREFIX%%/bin/jackd ${jackd_args}
echo -e "\n[`date`] Starting the daemon, user=$jackd_user args=\"$jackd_args\"" >> /var/log/${name}.log

# start the daemon
daemon -p /var/run/${name}.pid -u "$jackd_user" %%PREFIX%%/bin/jackd $jackd_args
}

load_rc_config ${name}
Expand Down
11 changes: 7 additions & 4 deletions audio/jack/pkg-message
Expand Up @@ -3,11 +3,15 @@ The new JACK server comes with a DBUS control interface:
$ jack_control help
$ jack_control ds oss
$ jack_control dp
$ jack_control dps rate 48000
$ jack_control dps wordlength 16
$ jack_control dps capture /dev/dsp0
$ jack_control dps playback /dev/dsp0
$ jack_control eps realtime False
$ jack_control start

Only root can grant real-time priority to processes for now, using rtprio(1).
Upcoming FreeBSD releases will have a MAC policy with a realtime user group.
To use real-time priority for JACK server and clients, load the mac_priority(4)
module and add the JACK user to the realtime group.

Memory locking has to be allowed in /etc/login.conf or ~/.login_conf. Set the
resource limit ":memorylocked=unlimited:" and don't forget to run
Expand All @@ -19,8 +23,7 @@ Note that only one JACK server can be run at a time. An /etc/rc.conf example:

jackd_enable="YES"
jackd_user="joe"
jackd_rtprio="YES"
jackd_args="-R -doss -r48000 -p1024 -n1 -w16 \
jackd_args="--no-realtime -doss -r48000 -p1024 -w16 \
--capture /dev/dsp0 --playback /dev/dsp0"

Official JACK example clients and tools are available as jack-example-tools.
Expand Down

0 comments on commit 100a985

Please sign in to comment.