diff options
Diffstat (limited to 'libs/ardour/session.cc')
-rw-r--r-- | libs/ardour/session.cc | 18 |
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 ()); + } } } |