summaryrefslogtreecommitdiff
path: root/libs/ardour/session.cc
diff options
context:
space:
mode:
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 ());
+ }
}
}