From: Robin Gareus Date: Wed, 26 Jul 2017 23:40:13 +0000 (+0200) Subject: Start a new write-pass when writing automation and locating while rolling X-Git-Tag: 5.11~166 X-Git-Url: https://git.carlh.net/gitweb/?a=commitdiff_plain;h=3899c06fae96c09a04a2bc63a414a1fcfa847557;p=ardour.git Start a new write-pass when writing automation and locating while rolling --- diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index a8f755da5e..3dad4ccd31 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -340,6 +340,8 @@ Automatable::protect_automation () void Automatable::non_realtime_locate (framepos_t now) { + bool rolling = _a_session.transport_rolling (); + for (Controls::iterator li = controls().begin(); li != controls().end(); ++li) { boost::shared_ptr c @@ -348,8 +350,34 @@ Automatable::non_realtime_locate (framepos_t now) boost::shared_ptr l = boost::dynamic_pointer_cast(c->list()); - if (l) { - l->start_write_pass (now); + if (!l) { + continue; + } + + bool am_touching = c->touching (); + if (rolling && am_touching) { + /* when locating while rolling, and writing automation, + * start a new write pass. + * compare to compare to non_realtime_transport_stop() + */ + const bool list_did_write = !l->in_new_write_pass (); + c->stop_touch (-1); // time is irrelevant + l->stop_touch (-1); + c->commit_transaction (list_did_write); + l->write_pass_finished (now, Config->get_automation_thinning_factor ()); + + if (l->automation_state () == Write) { + l->set_automation_state (Touch); + } + if (l->automation_playback ()) { + c->set_value_unchecked (c->list ()->eval (now)); + } + } + + l->start_write_pass (now); + + if (rolling && am_touching) { + c->start_touch (now); } } }