diff --git a/audio/jack/Makefile b/audio/jack/Makefile index 49efc4daf81a..f8eeea1cf31e 100644 --- a/audio/jack/Makefile +++ b/audio/jack/Makefile @@ -1,67 +1,67 @@ PORTNAME= jackit DISTVERSIONPREFIX= v DISTVERSION= 1.9.22 -PORTREVISION= 1 +PORTREVISION= 2 CATEGORIES= audio MAINTAINER= dev@submerge.ch COMMENT= Low latency audio server WWW= https://jackaudio.org/ LICENSE= GPLv2 LGPL21 LICENSE_COMB= multi LIB_DEPENDS= libsamplerate.so:audio/libsamplerate \ libsysinfo.so:devel/libsysinfo USES= compiler:c11 pkgconfig python shebangfix waf USE_LDCONFIG= yes USE_RC_SUBR= jackd USE_GITHUB= yes GH_ACCOUNT= jackaudio GH_PROJECT= jack2 CFLAGS+= -fPIC CPPFLAGS+= -I${LOCALBASE}/include SHEBANG_FILES= dbus/jack_control SHEBANG_LANG= python3 CONFIGURE_ARGS= --celt=no --samplerate=yes OPTIONS_DEFINE= ALSA DBUS OPUS PROFILING OPTIONS_DEFAULT= DBUS OPUS OPTIONS_SUB= yes ALSA_LIB_DEPENDS= libasound.so:audio/alsa-lib ALSA_CONFIGURE_OFF= --alsa=no ALSA_CONFIGURE_ON= --alsa=yes DBUS_CONFIGURE_ON= --dbus --classic --autostart=dbus DBUS_LIB_DEPENDS= libdbus-1.so:devel/dbus \ libexpat.so:textproc/expat2 DBUS_RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}dbus>0:devel/py-dbus@${PY_FLAVOR} OPUS_LIB_DEPENDS= libopus.so:audio/opus OPUS_CONFIGURE_ON= --opus=yes OPUS_CONFIGURE_OFF= --opus=no PROFILING_DESC= Build with profiling information PROFILING_CONFIGURE_ON= --profile .include .if ${PORT_OPTIONS:MDBUS} PLIST_SUB+= CLASSIC="@comment " .else PLIST_SUB+= CLASSIC="" .endif post-install: @cd ${STAGEDIR}${PREFIX} && ${STRIP_CMD} \ lib/libjack*.so \ lib/jack/*.so \ $$(ls bin/* | ${GREP} -v jack_control) .include diff --git a/audio/jack/files/jackd.in b/audio/jack/files/jackd.in index 9f135a6c8f1b..e78285044ea7 100644 --- a/audio/jack/files/jackd.in +++ b/audio/jack/files/jackd.in @@ -1,35 +1,64 @@ #!/bin/sh # PROVIDE: jackd # REQUIRE: LOGIN # # Add the following line to /etc/rc.conf to enable jackd: # # jackd_enable="YES" # : ${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 name=jackd 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} run_rc_command "$1" diff --git a/audio/jack/pkg-message b/audio/jack/pkg-message index 2a94946d2d57..6ab2e5764e59 100644 --- a/audio/jack/pkg-message +++ b/audio/jack/pkg-message @@ -1,29 +1,32 @@ 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 # cap_mkdb /etc/login.conf It's still possible to start JACK server as an RC service for a dedicated user. 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. JACK 1.9.22 introduces a latency correction fix. Latency correction parameters have to be measured again after an update.