diff options
author | Robin Gareus <robin@gareus.org> | 2017-09-19 02:10:38 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-09-19 02:11:22 +0200 |
commit | 10b76ae631d971611bcb389d18995942300d0404 (patch) | |
tree | 8fa12320f177b2745d8acdf6ceb3c37c34133459 /libs/ardour/session.cc | |
parent | 013088ca5f5d95654b43037685d835f212e38a8a (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.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 ()); + } } } |