int jack_bufsize_callback (pframes_t);
int jack_sample_rate_callback (pframes_t);
+#ifdef HAVE_JACK_NEW_LATENCY
+ static void _latency_callback (jack_latency_callback_mode_t, void*);
+ void jack_latency_callback (jack_latency_callback_mode_t);
+#endif
+
int connect_to_jack (std::string client_name, std::string session_uuid);
static void halted (void *);
void request_monitor_input (bool);
void set_latency (framecnt_t);
+#ifdef HAVE_JACK_NEW_LATENCY
void get_connected_latency_range (jack_latency_range_t& range, jack_latency_callback_mode_t mode) const;
void set_latency_range (jack_latency_range_t& range, jack_latency_callback_mode_t mode) const;
+#endif
virtual void reset ();
void reset_jack_connection (jack_client_t* jack);
void process_rtop (SessionEvent*);
+#ifdef HAVE_JACK_NEW_LATENCY
+ void update_latency (bool playback);
+#endif
+
XMLNode& state(bool);
/* click track */
#include <sstream>
#include <glibmm/timer.h>
+#include <jack/weakjack.h>
#include <jack/jack.h>
#include <jack/thread.h>
MIDI::Port::set_process_thread (pthread_self());
}
-typedef void (*_JackInfoShutdownCallback)(jack_status_t code, const char* reason, void *arg);
-
-static void (*on_info_shutdown)(jack_client_t*, _JackInfoShutdownCallback, void *);
-extern void jack_on_info_shutdown (jack_client_t*, _JackInfoShutdownCallback, void *) __attribute__((weak));
-
-static void check_jack_symbols () __attribute__((constructor));
-
-void check_jack_symbols ()
-{
- /* use weak linking to see if we really have various late-model JACK function */
- on_info_shutdown = jack_on_info_shutdown;
-}
-
static void
ardour_jack_error (const char* msg)
{
_processed_frames = 0;
last_monitor_check = 0;
- if (on_info_shutdown) {
+ if (jack_on_info_shutdown) {
jack_on_info_shutdown (_priv_jack, halted_info, this);
} else {
jack_on_shutdown (_priv_jack, halted, this);
#ifdef HAVE_JACK_SESSION
if( jack_set_session_callback )
jack_set_session_callback (_priv_jack, _session_callback, this);
+#endif
+#if HAVE_JACK_NEW_LATENCY
+ if (jack_set_latency_callback) {
+ jack_set_latency_callback (_priv_jack, _latency_callback, this);
+ }
#endif
jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
}
+void
+AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
+{
+ return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
+}
+
void
AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
{
return 0;
}
+void
+AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
+{
+ cerr << "JACK LATENCY CALLBACK\n";
+ if (_session) {
+ _session->update_latency (mode == JackPlaybackLatency);
+ } else {
+ cerr << "NO SESSION\n";
+ }
+}
+
int
AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
{
void
Port::recompute_total_latency () const
{
-#if !HAVE_JACK_NEW_LATENCY
-#ifdef HAVE_JACK_RECOMPUTE_LATENCY
+#ifndef HAVE_JACK_NEW_LATENCY
+#ifdef HAVE_JACK_RECOMPUTE_LATENCY
jack_client_t* jack = _engine->jack();
if (!jack) {
void
Port::set_latency_range (jack_latency_range_t& range, jack_latency_callback_mode_t mode) const
{
-#if HAVE_JACK_NEW_LATENCY
+#ifdef HAVE_JACK_NEW_LATENCY
if (!jack_port_set_latency_range) {
return;
}
void
Port::get_connected_latency_range (jack_latency_range_t& range, jack_latency_callback_mode_t mode) const
{
-#if HAVE_JACK_NEW_LATENCY
+#ifdef HAVE_JACK_NEW_LATENCY
if (!jack_port_get_latency_range) {
return;
}
framecnt_t
Port::total_latency () const
{
-#if !HAVE_JACK_NEW_LATENCY
+#ifndef HAVE_JACK_NEW_LATENCY
jack_client_t* jack = _engine->jack();
if (!jack) {
void
Port::set_latency (framecnt_t n)
{
-#if !HAVE_JACK_NEW_LATENCY
+#ifndef HAVE_JACK_NEW_LATENCY
jack_port_set_latency (_jack_port, n);
#endif
}
void
Route::update_port_latencies (const PortSet& ports, jack_latency_callback_mode_t mode, framecnt_t our_latency) const
{
+#ifdef HAVE_JACK_NEW_LATENCY
/* iterate over all connected ports and get the latency range
they represent
*/
p->set_latency_range (range, mode);
}
+#endif
}
return p;
}
+#ifdef HAVE_JACK_NEW_LATENCY
+void
+Session::update_latency (bool playback)
+{
+ DEBUG_TRACE (DEBUG::Latency, "JACK latency callback\n");
+}
+#endif
framecnt_t track_latency = (*i)->update_total_latency ();
if (old_latency != track_latency) {
-#if !HAVE_JACK_NEW_LATENCY
+#ifndef HAVE_JACK_NEW_LATENCY
(*i)->input()->update_port_total_latencies ();
(*i)->output()->update_port_total_latencies ();
#endif
linkflags = ['-ljack'],
msg = 'Checking for new JACK latency API',
define_name = 'HAVE_JACK_NEW_LATENCY',
+ uselib_store = "JACK_NEW_LATENCY",
okmsg = 'present')
-
+
if flac_supported():
conf.define ('HAVE_FLAC', 1)
if ogg_supported():