int reconnect ();
void request_monitor_input (bool);
void set_latency (framecnt_t);
+
+ 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;
virtual void reset ();
class IOProcessor;
class Panner;
class PannerShell;
+class PortSet;
class Processor;
class RouteGroup;
class Send;
void all_processors_flip();
void all_processors_active (Placement, bool state);
+ void set_latency_ranges (jack_latency_callback_mode_t mode) const;
virtual framecnt_t update_total_latency();
void set_latency_delay (framecnt_t);
void set_user_latency (framecnt_t);
void set_mute_master_solo ();
void set_processor_positions ();
+ void update_port_latencies (const PortSet& ports, jack_latency_callback_mode_t mode, framecnt_t) const;
};
} // namespace ARDOUR
#include "libardour-config.h"
#endif
+#include <jack/weakjack.h> // so that we can test for new functions at runtime
+
#include "ardour/port.h"
#include "ardour/audioengine.h"
#include "pbd/failed_constructor.h"
void
Port::recompute_total_latency () const
{
+#if !HAVE_JACK_NEW_LATENCY
#ifdef HAVE_JACK_RECOMPUTE_LATENCY
jack_client_t* jack = _engine->jack();
jack_recompute_total_latency (jack, _jack_port);
#endif
+#endif
+}
+
+void
+Port::set_latency_range (jack_latency_range_t& range, jack_latency_callback_mode_t mode) const
+{
+#if HAVE_JACK_NEW_LATENCY
+ if (!jack_port_set_latency_range) {
+ return;
+ }
+
+ jack_port_set_latency_range (_jack_port, mode, &range);
+#endif
+}
+
+void
+Port::get_connected_latency_range (jack_latency_range_t& range, jack_latency_callback_mode_t mode) const
+{
+#if HAVE_JACK_NEW_LATENCY
+ if (!jack_port_get_latency_range) {
+ return;
+ }
+
+ vector<string> connections;
+ jack_client_t* jack = _engine->jack();
+
+ if (!jack) {
+ range.min = 0;
+ range.max = 0;
+ PBD::warning << _("get_connected_latency_range() called while disconnected from JACK") << endmsg;
+ return;
+ }
+
+ get_connections (connections);
+
+ if (!connections.empty()) {
+
+ range.min = ~((jack_nframes_t) 0);
+ range.max = 0;
+
+ for (vector<string>::iterator c = connections.begin(); c != connections.end(); ++c) {
+ jack_port_t* remote_port = jack_port_by_name (_engine->jack(), (*c).c_str());
+ jack_latency_range_t lr;
+
+ if (remote_port) {
+ jack_port_get_latency_range (remote_port, mode, &lr);
+ range.min = min (range.min, lr.min);
+ range.min = max (range.max, lr.max);
+ }
+ }
+
+ } else {
+
+ range.min = 0;
+ range.max = 0;
+ }
+#endif /* HAVE_JACK_NEW_LATENCY */
}
framecnt_t
Port::total_latency () const
{
+#if !HAVE_JACK_NEW_LATENCY
jack_client_t* jack = _engine->jack();
if (!jack) {
}
return jack_port_get_total_latency (jack, _jack_port);
+#else
+ return 0;
+#endif
}
int
void
Port::set_latency (framecnt_t n)
{
+#if !HAVE_JACK_NEW_LATENCY
jack_port_set_latency (_jack_port, n);
+#endif
}
bool
return p;
}
+
+void
+Route::set_latency_ranges (jack_latency_callback_mode_t mode) const
+{
+ if (mode == JackPlaybackLatency) {
+ update_port_latencies (_input->ports (), mode, _input->effective_latency());
+ } else {
+ update_port_latencies (_output->ports (), mode, _output->effective_latency());
+ }
+
+}
+
+void
+Route::update_port_latencies (const PortSet& ports, jack_latency_callback_mode_t mode, framecnt_t our_latency) const
+{
+ /* iterate over all connected ports and get the latency range
+ they represent
+ */
+
+ for (PortSet::const_iterator p = ports.begin(); p != ports.end(); ++p) {
+
+ jack_latency_range_t range;
+
+ p->get_connected_latency_range (range, mode);
+
+ /* add the latency created within this route
+ */
+
+ range.min += our_latency;
+ range.max += our_latency;
+
+ p->set_latency_range (range, mode);
+ }
+}
#include <cerrno>
#include <unistd.h>
+#ifdef WAF_BUILD
+#include "libardour-config.h"
+#endif
+
#include "pbd/undo.h"
#include "pbd/error.h"
_worst_track_latency = 0;
ptw = post_transport_work();
-#undef DEBUG_LATENCY
-#ifdef DEBUG_LATENCY
- cerr << "\n---------------------------------\nUPDATE LATENCY\n";
-#endif
+ DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency\n\n")
boost::shared_ptr<RouteList> r = routes.reader ();
framecnt_t track_latency = (*i)->update_total_latency ();
if (old_latency != track_latency) {
+#if !HAVE_JACK_NEW_LATENCY
(*i)->input()->update_port_total_latencies ();
(*i)->output()->update_port_total_latencies ();
+#endif
update_jack = true;
}
_engine.update_total_latencies ();
}
-#ifdef DEBUG_LATENCY
- cerr << "\tworst was " << _worst_track_latency << endl;
-#endif
+ DEBUG_TRACE(DEBUG::Latency, string_compose("worst case latency was %1\n", _worst_track_latency));
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
(*i)->set_latency_delay (_worst_track_latency);
linkflags = ['-ljack'],
msg = 'Checking for jack_on_info_shutdown',
define_name = 'HAVE_JACK_ON_INFO_SHUTDOWN',
- okmsg = 'ok')
+ okmsg = 'present')
+
+ conf.check_cc(fragment = "#include <jack/jack.h>\nint main(int argc, char **argv) { jack_port_t* p; jack_latency_range_t r; jack_port_set_latency_range (p, JackCaptureLatency, &r); return 0; }\n",
+ linkflags = ['-ljack'],
+ msg = 'Checking for new JACK latency API',
+ define_name = 'HAVE_JACK_NEW_LATENCY',
+ okmsg = 'present')
if flac_supported():
conf.define ('HAVE_FLAC', 1)