diff options
author | Robin Gareus <robin@gareus.org> | 2017-09-28 06:08:30 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-09-29 05:03:48 +0200 |
commit | 8ff3b5ecf6bd2b7d69b8f154ba8d21eb4fe86304 (patch) | |
tree | 9e958d0e81c94f72258472df68e171378a8e48b5 /libs/ardour | |
parent | 491523d6b7e45687cd9bbab8eb35d4224a2e4939 (diff) |
Add API to query IO latencies
IO::connected_latency() is relevant once Ardour publishes individual
per Port latency.
IO::public_latency() is only for debug purposes.
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/io.h | 3 | ||||
-rw-r--r-- | libs/ardour/io.cc | 61 |
2 files changed, 60 insertions, 4 deletions
diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index 6f62e4ca74..ed43341dbb 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -116,7 +116,10 @@ class LIBARDOUR_API IO : public SessionObject, public Latent bool physically_connected () const; samplecnt_t signal_latency () const { return 0; } + samplecnt_t latency () const; + samplecnt_t public_latency () const; + samplecnt_t connected_latency (bool for_playback) const; PortSet& ports() { return _ports; } const PortSet& ports() const { return _ports; } diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 90db95ad59..426fca715c 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -1219,14 +1219,12 @@ IO::apply_pretty_name () samplecnt_t IO::latency () const { - samplecnt_t max_latency; - samplecnt_t latency; - - max_latency = 0; + samplecnt_t max_latency = 0; /* io lock not taken - must be protected by other means */ for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) { + samplecnt_t latency; if ((latency = i->private_latency_range (_direction == Output).max) > max_latency) { DEBUG_TRACE (DEBUG::Latency, string_compose ("port %1 has %2 latency of %3 - use\n", name(), @@ -1242,6 +1240,61 @@ IO::latency () const return max_latency; } +samplecnt_t +IO::public_latency () const +{ + samplecnt_t max_latency = 0; + + /* io lock not taken - must be protected by other means */ + + for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) { + samplecnt_t latency; + if ((latency = i->public_latency_range (_direction == Output).max) > max_latency) { + DEBUG_TRACE (DEBUG::Latency, string_compose ("port %1 has %2 latency of %3 - use\n", + name(), + ((_direction == Output) ? "PLAYBACK" : "CAPTURE"), + latency)); + max_latency = latency; + } + } + + DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: max %4 public latency from %2 ports = %3\n", + name(), _ports.num_ports(), max_latency, + ((_direction == Output) ? "PLAYBACK" : "CAPTURE"))); + return max_latency; +} + +samplecnt_t +IO::connected_latency (bool for_playback) const +{ + /* io lock not taken - must be protected by other means */ + samplecnt_t max_latency = 0; + bool connected = false; + + /* if output is not connected to anything, use private latency */ + for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) { + if (i->connected()) { + connected = true; + max_latency = 0; + break; + } + samplecnt_t latency; + if ((latency = i->private_latency_range (for_playback).max) > max_latency) { + max_latency = latency; + } + } + if (connected) { + for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) { + LatencyRange lr; + i->get_connected_latency_range (lr, for_playback); + if (lr.max > max_latency) { + max_latency = lr.max; + } + } + } + return max_latency; +} + int IO::connect_ports_to_bundle (boost::shared_ptr<Bundle> c, bool exclusive, void* src) { return connect_ports_to_bundle(c, exclusive, false, src); |