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); } }