summaryrefslogtreecommitdiff
path: root/libs/ardour/session.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-09-19 02:10:38 +0200
committerRobin Gareus <robin@gareus.org>2017-09-19 02:11:22 +0200
commit10b76ae631d971611bcb389d18995942300d0404 (patch)
tree8fa12320f177b2745d8acdf6ceb3c37c34133459 /libs/ardour/session.cc
parent013088ca5f5d95654b43037685d835f212e38a8a (diff)
Various updates and fixes for Latency Compensation
* centralize signal_latency_at_***_position to processors * update initial-delay/roll-delay when processor order changes * consolidate signal-latency calculation: use the same method for processor-changes and session's post_playback_latency. * include relative output-delay in roll-delay * fix capture processor position & optimize stem-export latency (roll-delay fixes pending Route:roll() update)
Diffstat (limited to 'libs/ardour/session.cc')
-rw-r--r--libs/ardour/session.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 33ed2c22d3..af0f66a889 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -199,6 +199,8 @@ Session::Session (AudioEngine &eng,
, _worst_output_latency (0)
, _worst_input_latency (0)
, _worst_track_latency (0)
+ , _worst_track_out_latency (0)
+ , _worst_track_roll_delay (0)
, _have_captured (false)
, _non_soloed_outs_muted (false)
, _listening (false)
@@ -6915,15 +6917,25 @@ Session::post_playback_latency ()
boost::shared_ptr<RouteList> r = routes.reader ();
+ _worst_track_out_latency = 0;
+
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
assert (!(*i)->is_auditioner()); // XXX remove me
- if ((*i)->active()) {
- _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
+ if (!(*i)->active()) { continue ; }
+ _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
+ if (boost::dynamic_pointer_cast<Track> (*i)) {
+ _worst_track_out_latency = max (_worst_track_out_latency, (*i)->output ()->latency ());
}
}
+ _worst_track_roll_delay = 0;
+
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
- (*i)->set_latency_compensation (_worst_track_latency);
+ if (!(*i)->active()) { continue ; }
+ (*i)->set_latency_compensation (_worst_track_latency + _worst_track_out_latency - (*i)->output ()->latency ());
+ if (boost::dynamic_pointer_cast<Track> (*i)) {
+ _worst_track_roll_delay = max (_worst_track_roll_delay, (*i)->initial_delay ());
+ }
}
}