[jack-audio-connection-kit] Rename limits file from 99-jack.conf to 95-jack.conf RHBZ#795094
Orcan Ogetbil
oget at fedoraproject.org
Sun Mar 25 18:45:10 UTC 2012
commit 6f32490dcc561d4cec08db16b57ba6f0ee9a57e6
Author: Orcan Ogetbil <oget.fedora at gmail.com>
Date: Sun Mar 25 14:45:06 2012 -0400
Rename limits file from 99-jack.conf to 95-jack.conf RHBZ#795094
- Increase maximum number of ports and clients RHBZ#803871
- Backport ffado runtime buffersize change feature from upstream trunk
- Backport jack-connect executable segfault fix from upstream trunk
jack-audio-connection-kit.spec | 23 +++-
jack-ffado-buffersize.patch | 230 +++++++++++++++++++++++++++++++++++++++
jack-fix-connect-segfault.patch | 35 ++++++
3 files changed, 284 insertions(+), 4 deletions(-)
---
diff --git a/jack-audio-connection-kit.spec b/jack-audio-connection-kit.spec
index 32dfb23..c3c8140 100644
--- a/jack-audio-connection-kit.spec
+++ b/jack-audio-connection-kit.spec
@@ -4,7 +4,7 @@
Summary: The Jack Audio Connection Kit
Name: jack-audio-connection-kit
Version: 1.9.8
-Release: 5%{?dist}
+Release: 6%{?dist}
# The entire source (~500 files) is a mixture of these three licenses
License: GPLv2 and GPLv2+ and LGPLv2+
Group: System Environment/Daemons
@@ -19,13 +19,18 @@ Patch0: jack-audio-connection-kit-no_date_footer.patch
Patch1: jack-doxygen-output-dir-fix.patch
# We don't want the internal API documentation
Patch2: jack-apidoc-only.patch
+# Enable ffado buffersize change at runtime. From upstream trunk
+# https://github.com/jackaudio/jack2/commit/96e025123
+Patch3: jack-ffado-buffersize.patch
Patch4: jack-realtime-compat.patch
+# Fix jack-connect segfault when invoked with no arguments. From upstream trunk
+# https://github.com/jackaudio/jack2/commit/00280570a
+Patch5: jack-fix-connect-segfault.patch
# Fix ppc64 mpd startup issue RHBZ#799552
Patch6: jack-ppc64-long.patch
# uc_regs no longer available on ppc64
Patch7: jack-audio-connection-kit-ppc-uc_regs.patch
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: alsa-lib-devel
BuildRequires: dbus-devel
BuildRequires: celt-devel
@@ -90,7 +95,9 @@ pushd jack-%{version}
%patch0 -p1 -b .nodate
%patch1 -p1 -b .outdir
%patch2 -p1 -b .nointernalapi
+%patch3 -p1 -b .ffadobuffer
%patch4 -p1
+%patch5 -p1 -b .connectcrash
%patch6 -p1 -b .mpd
%patch7 -p1 -b .uc_regs
@@ -120,7 +127,9 @@ export PREFIX=%{_prefix}
--firewire \
--freebob \
%endif
- --alsa
+ --alsa \
+ --clients 256 \
+ --ports-per-application=2048
./waf build %{?_smp_mflags} -v
@@ -137,7 +146,7 @@ rm -rf $RPM_BUILD_ROOT%{_datadir}/jack-audio-connection-kit
# install our limits to the /etc/security/limits.d
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/security/limits.d
sed -e 's, at groupname@,%groupname,g; s, at pagroup@,%pagroup,g;' \
- %{SOURCE3} > $RPM_BUILD_ROOT%{_sysconfdir}/security/limits.d/99-jack.conf
+ %{SOURCE3} > $RPM_BUILD_ROOT%{_sysconfdir}/security/limits.d/95-jack.conf
# prepare README.Fedora for documentation including
install -p -m644 %{SOURCE1} README.Fedora
@@ -252,6 +261,12 @@ exit 0
%changelog
+* Sun Mar 25 2012 Orcan Ogetbil <oget[dot]fedora[at]gmail[dot]com> - 1.9.8-6
+- Rename limits file from 99-jack.conf to 95-jack.conf RHBZ#795094
+- Increase maximum number of ports and clients RHBZ#803871
+- Backport ffado runtime buffersize change feature from upstream trunk
+- Backport jack-connect executable segfault fix from upstream trunk
+
* Fri Mar 02 2012 Orcan Ogetbil <oget[dot]fedora[at]gmail[dot]com> - 1.9.8-5
- Fix ppc64 mpd issue RHBZ#799552
diff --git a/jack-ffado-buffersize.patch b/jack-ffado-buffersize.patch
new file mode 100644
index 0000000..0dbc2ea
--- /dev/null
+++ b/jack-ffado-buffersize.patch
@@ -0,0 +1,230 @@
+diff -rupN jack-1.9.8.old/linux/firewire/JackFFADODriver.cpp jack-1.9.8/linux/firewire/JackFFADODriver.cpp
+--- jack-1.9.8.old/linux/firewire/JackFFADODriver.cpp 2011-12-19 06:54:27.000000000 -0500
++++ jack-1.9.8/linux/firewire/JackFFADODriver.cpp 2012-03-25 01:38:58.246513167 -0400
+@@ -3,6 +3,7 @@ Copyright (C) 2001 Paul Davis
+ Copyright (C) 2004 Grame
+ Copyright (C) 2007 Pieter Palmers
+ Copyright (C) 2009 Devin Anderson
++Copyright (C) 2012 Jonathan Woithe, Adrian Knoth
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+@@ -45,10 +46,20 @@ Foundation, Inc., 675 Mass Ave, Cambridg
+ #include "JackCompilerDeps.h"
+ #include "JackLockedEngine.h"
+
++// FFADO_API_VERSION was first defined with API_VERSION 9, so all previous
++// headers do not provide this define.
++#ifndef FFADO_API_VERSION
++extern "C" int ffado_streaming_set_period_size(ffado_device_t *dev,
++ unsigned int period) __attribute__((__weak__));
++#endif
++
+ namespace Jack
+ {
+
++// Basic functionality requires API version 8. If version 9 or later
++// is present the buffers can be resized at runtime.
+ #define FIREWIRE_REQUIRED_FFADO_API_VERSION 8
++#define FIREWIRE_REQUIRED_FFADO_API_VERSION_FOR_SETBUFSIZE 9
+
+ #define jack_get_microseconds GetMicroSeconds
+
+@@ -253,22 +264,96 @@ JackFFADODriver::ffado_driver_restart (f
+ return Start();
+ }
+
++void
++JackFFADODriver::UpdateLatencies(void)
++{
++ jack_latency_range_t range;
++ ffado_driver_t* driver = (ffado_driver_t*)fDriver;
++
++ for (int i = 0; i < fCaptureChannels; i++) {
++ range.min = range.max = driver->period_size + driver->capture_frame_latency;
++ fGraphManager->GetPort(fCapturePortList[i])->SetLatencyRange(JackCaptureLatency, &range);
++ }
++
++ for (int i = 0; i < fPlaybackChannels; i++) {
++ // Add one buffer more latency if "async" mode is used...
++ range.min = range.max = (driver->period_size *
++ (driver->device_options.nb_buffers - 1)) +
++ ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency;
++ fGraphManager->GetPort(fPlaybackPortList[i])->SetLatencyRange(JackPlaybackLatency, &range);
++ // Monitor port
++ if (fWithMonitorPorts) {
++ range.min = range.max =driver->period_size;
++ fGraphManager->GetPort(fMonitorPortList[i])->SetLatencyRange(JackCaptureLatency, &range);
++ }
++ }
++}
++
+ int
+ JackFFADODriver::SetBufferSize (jack_nframes_t nframes)
+ {
+- printError("Buffer size change requested but not supported!!!");
++ ffado_driver_t* driver = (ffado_driver_t*)fDriver;
++ signed int chn;
++
++ // The speed of this function isn't critical; we can afford the
++ // time to check the FFADO API version.
++ if (ffado_get_api_version() < FIREWIRE_REQUIRED_FFADO_API_VERSION_FOR_SETBUFSIZE ||
++ ffado_streaming_set_period_size == NULL) {
++ printError("unsupported on current version of FFADO; please upgrade FFADO");
++ return -1;
++ }
+
+- /*
+ driver->period_size = nframes;
+ driver->period_usecs =
+ (jack_time_t) floor ((((float) nframes) / driver->sample_rate)
+ * 1000000.0f);
+- */
++
++
++ // Reallocate the null and scratch buffers.
++ driver->nullbuffer = (ffado_sample_t*) calloc(driver->period_size, sizeof(ffado_sample_t));
++ if(driver->nullbuffer == NULL) {
++ printError("could not allocate memory for null buffer");
++ return -1;
++ }
++ driver->scratchbuffer = (ffado_sample_t*) calloc(driver->period_size, sizeof(ffado_sample_t));
++ if(driver->scratchbuffer == NULL) {
++ printError("could not allocate memory for scratch buffer");
++ return -1;
++ }
++
++ // MIDI buffers need reallocating
++ for (chn = 0; chn < driver->capture_nchannels; chn++) {
++ if(driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
++ // setup the midi buffer
++ if (driver->capture_channels[chn].midi_buffer != NULL)
++ free(driver->capture_channels[chn].midi_buffer);
++ driver->capture_channels[chn].midi_buffer = (ffado_sample_t*) calloc(driver->period_size, sizeof(uint32_t));
++ }
++ }
++ for (chn = 0; chn < driver->playback_nchannels; chn++) {
++ if(driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
++ if (driver->playback_channels[chn].midi_buffer != NULL)
++ free(driver->playback_channels[chn].midi_buffer);
++ driver->playback_channels[chn].midi_buffer = (ffado_sample_t*) calloc(driver->period_size, sizeof(uint32_t));
++ }
++ }
++
++ // Notify FFADO of the period size change
++ if (ffado_streaming_set_period_size(driver->dev, nframes) != 0) {
++ printError("could not alter FFADO device period size");
++ return -1;
++ }
++
++ // This is needed to give the shadow variables a chance to
++ // properly update to the changes.
++ sleep(1);
+
+ /* tell the engine to change its buffer size */
+- //driver->engine->set_buffer_size (driver->engine, nframes);
++ JackAudioDriver::SetBufferSize(nframes); // Generic change, never fails
++
++ UpdateLatencies();
+
+- return -1; // unsupported
++ return 0;
+ }
+
+ typedef void (*JackDriverFinishFunction) (jack_driver_t *);
+@@ -281,7 +366,7 @@ JackFFADODriver::ffado_driver_new (const
+
+ assert(params);
+
+- if (ffado_get_api_version() != FIREWIRE_REQUIRED_FFADO_API_VERSION) {
++ if (ffado_get_api_version() < FIREWIRE_REQUIRED_FFADO_API_VERSION) {
+ printError("Incompatible libffado version! (%s)", ffado_get_version());
+ return NULL;
+ }
+@@ -349,7 +434,6 @@ int JackFFADODriver::Attach()
+ jack_port_id_t port_index;
+ char buf[REAL_JACK_PORT_NAME_SIZE];
+ char portname[REAL_JACK_PORT_NAME_SIZE];
+- jack_latency_range_t range;
+
+ ffado_driver_t* driver = (ffado_driver_t*)fDriver;
+
+@@ -435,8 +519,6 @@ int JackFFADODriver::Attach()
+ ffado_streaming_capture_stream_onoff(driver->dev, chn, 0);
+
+ port = fGraphManager->GetPort(port_index);
+- range.min = range.max = driver->period_size + driver->capture_frame_latency;
+- port->SetLatencyRange(JackCaptureLatency, &range);
+ // capture port aliases (jackd1 style port names)
+ snprintf(buf, sizeof(buf), "%s:capture_%i", fClientControl.fName, (int) chn + 1);
+ port->SetAlias(buf);
+@@ -466,9 +548,6 @@ int JackFFADODriver::Attach()
+ // setup the midi buffer
+ driver->capture_channels[chn].midi_buffer = (uint32_t *)calloc(driver->period_size, sizeof(uint32_t));
+
+- port = fGraphManager->GetPort(port_index);
+- range.min = range.max = driver->period_size + driver->capture_frame_latency;
+- port->SetLatencyRange(JackCaptureLatency, &range);
+ fCapturePortList[chn] = port_index;
+ jack_log("JackFFADODriver::Attach fCapturePortList[i] %ld ", port_index);
+ fCaptureChannels++;
+@@ -512,8 +591,6 @@ int JackFFADODriver::Attach()
+
+ port = fGraphManager->GetPort(port_index);
+ // Add one buffer more latency if "async" mode is used...
+- range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency;
+- port->SetLatencyRange(JackPlaybackLatency, &range);
+ // playback port aliases (jackd1 style port names)
+ snprintf(buf, sizeof(buf), "%s:playback_%i", fClientControl.fName, (int) chn + 1);
+ port->SetAlias(buf);
+@@ -548,9 +625,6 @@ int JackFFADODriver::Attach()
+
+ driver->playback_channels[chn].midi_buffer = (uint32_t *)calloc(driver->period_size, sizeof(uint32_t));
+
+- port = fGraphManager->GetPort(port_index);
+- range.min = range.max = (driver->period_size * (driver->device_options.nb_buffers - 1)) + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize) + driver->playback_frame_latency;
+- port->SetLatencyRange(JackPlaybackLatency, &range);
+ fPlaybackPortList[chn] = port_index;
+ jack_log("JackFFADODriver::Attach fPlaybackPortList[i] %ld ", port_index);
+ fPlaybackChannels++;
+@@ -559,6 +633,8 @@ int JackFFADODriver::Attach()
+ }
+ }
+
++ UpdateLatencies();
++
+ assert(fCaptureChannels < DRIVER_PORT_NUM);
+ assert(fPlaybackChannels < DRIVER_PORT_NUM);
+
+diff -rupN jack-1.9.8.old/linux/firewire/JackFFADODriver.h jack-1.9.8/linux/firewire/JackFFADODriver.h
+--- jack-1.9.8.old/linux/firewire/JackFFADODriver.h 2011-12-19 06:54:27.000000000 -0500
++++ jack-1.9.8/linux/firewire/JackFFADODriver.h 2012-03-25 01:38:05.708754669 -0400
+@@ -2,6 +2,7 @@
+ Copyright (C) 2001 Paul Davis
+ Copyright (C) 2004 Grame
+ Copyright (C) 2007 Pieter Palmers
++Copyright (C) 2012 Adrian Knoth
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+@@ -59,6 +60,7 @@ class JackFFADODriver : public JackAudio
+
+ void jack_driver_init (jack_driver_t *driver);
+ void jack_driver_nt_init (jack_driver_nt_t * driver);
++ void UpdateLatencies();
+
+ public:
+
+@@ -80,6 +82,12 @@ class JackFFADODriver : public JackAudio
+ int Read();
+ int Write();
+
++ // BufferSize can be changed
++ bool IsFixedBufferSize()
++ {
++ return false;
++ }
++
+ int SetBufferSize(jack_nframes_t nframes);
+ };
+
diff --git a/jack-fix-connect-segfault.patch b/jack-fix-connect-segfault.patch
new file mode 100644
index 0000000..4bb8b32
--- /dev/null
+++ b/jack-fix-connect-segfault.patch
@@ -0,0 +1,35 @@
+From 00280570af529e4a54009bd5c6aeeab05286efcf Mon Sep 17 00:00:00 2001
+From: Adrian Knoth <adi at drcomp.erfurt.thur.de>
+Date: Thu, 8 Mar 2012 21:54:22 +0100
+Subject: [PATCH] Fix segfault in jack_connect
+
+When jack_connect is called without any argument, it causes a segfault
+in
+
+ snprintf( portA, sizeof(portA), "%s", argv[argc-1] );
+ snprintf( portB, sizeof(portB), "%s", argv[argc-2] );
+
+Reported in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=662199
+---
+ example-clients/connect.c | 5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+diff --git a/example-clients/connect.c b/example-clients/connect.c
+index 5ed112b..0f4f8be 100644
+--- a/example-clients/connect.c
++++ b/example-clients/connect.c
+@@ -128,7 +128,10 @@ void port_connect_callback(jack_port_id_t a, jack_port_id_t b, int connect, void
+ return 1;
+ }
+
+- if (argc < 3) show_usage(my_name);
++ if (argc < 3) {
++ show_usage(my_name);
++ return 1;
++ }
+
+ /* try to become a client of the JACK server */
+
+--
+1.7.5.4
+
More information about the scm-commits
mailing list