From 01c253b61b3130d13f9e30f17683e0f8a93b4696 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Feb 2011 18:47:10 +0000 Subject: part one of several parts: implement support for new (and correct) JACK latency API git-svn-id: svn://localhost/ardour2/branches/3.0@8863 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/port.cc | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'libs/ardour/port.cc') diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc index 2a89560b77..7d6abbdb04 100644 --- a/libs/ardour/port.cc +++ b/libs/ardour/port.cc @@ -21,6 +21,8 @@ #include "libardour-config.h" #endif +#include // so that we can test for new functions at runtime + #include "ardour/port.h" #include "ardour/audioengine.h" #include "pbd/failed_constructor.h" @@ -219,6 +221,7 @@ Port::reset () void Port::recompute_total_latency () const { +#if !HAVE_JACK_NEW_LATENCY #ifdef HAVE_JACK_RECOMPUTE_LATENCY jack_client_t* jack = _engine->jack(); @@ -228,11 +231,69 @@ Port::recompute_total_latency () const 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 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::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) { @@ -240,6 +301,9 @@ Port::total_latency () const } return jack_port_get_total_latency (jack, _jack_port); +#else + return 0; +#endif } int @@ -305,7 +369,9 @@ Port::request_monitor_input (bool yn) void Port::set_latency (framecnt_t n) { +#if !HAVE_JACK_NEW_LATENCY jack_port_set_latency (_jack_port, n); +#endif } bool -- cgit v1.2.3