From 4998b2711b510141561f444de7dca99ba2327fd0 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 14 Sep 2021 21:33:08 +0200 Subject: [PATCH] Amend f301e692a: expose compensated port-latency Retain min/max when copying inherited latency from connected ports. When there is a direct connection port A out -> port B in, min/max latency range should be retained in direction of signal flow. Ardour can only adjust latency in reverse direction of signal flow to match min = max with an internal delay-line. ie set playback latency of an input port, or capture latency of an output port. --- libs/ardour/ardour/io.h | 1 + libs/ardour/io.cc | 27 +++++++++++++++++++++++++++ libs/ardour/route.cc | 8 ++++---- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index 4784b4205d..5115310540 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -124,6 +124,7 @@ public: void set_private_port_latencies (samplecnt_t value, bool playback); void set_public_port_latencies (samplecnt_t value, bool playback) const; + void set_public_port_latency_from_connections () const; PortSet& ports() { return _ports; } const PortSet& ports() const { return _ports; } diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 57bbade9de..5e6af7fdd7 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -1261,6 +1261,33 @@ IO::set_private_port_latencies (samplecnt_t value, bool playback) } } +void +IO::set_public_port_latency_from_connections () const +{ + /* get min/max of connected up/downstream ports */ + bool connected = false; + bool playback = _direction == Output; + LatencyRange lr; + lr.min = ~((pframes_t) 0); + lr.max = 0; + + for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) { + if (i->connected()) { + connected = true; + } + i->collect_latency_from_backend (lr, playback); + } + + if (!connected) { + /* if output is not connected to anything, use private latency */ + lr.min = lr.max = latency (); + } + + for (PortSet::const_iterator i = _ports.begin (); i != _ports.end(); ++i) { + i->set_public_latency_range (lr, playback); + } +} + void IO::set_public_port_latencies (samplecnt_t value, bool playback) const { diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 092c8b72eb..6efc03c0aa 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -5002,17 +5002,17 @@ Route::set_public_port_latencies (samplecnt_t value, bool playback, bool with_la * latency compensation into account. */ if (playback) { - _output->set_public_port_latencies (_output->latency (), playback); + _output->set_public_port_latency_from_connections (); if (_delayline && with_latcomp) { value += _delayline->delay (); } - _input->set_public_port_latencies (value, playback); + _input->set_public_port_latencies (value, true); } else { - _input->set_public_port_latencies (_input->latency(), playback); + _input->set_public_port_latency_from_connections (); if (_delayline && with_latcomp) { value += _delayline->delay (); } - _output->set_public_port_latencies (value, playback); + _output->set_public_port_latencies (value, false); } }