diff options
author | Robin Gareus <robin@gareus.org> | 2018-12-16 04:07:55 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2018-12-16 04:25:24 +0100 |
commit | 6b1b72a247bf04c81292fc41af4f69c9b7f90379 (patch) | |
tree | 9d5757acb39b406ae0215ec692c0cd58d843b2ff /libs/ardour/automatable.cc | |
parent | e4d3ebfb666e2c4e9cf134d8f3ed42152da343bf (diff) |
Optimize automation-event process splitting
Use RCU of automated parameter when looking for next automation event
to use for split processing. This speeds up PluginInsert processing
when rolling for plugins with many not-automated parameters.
Diffstat (limited to 'libs/ardour/automatable.cc')
-rw-r--r-- | libs/ardour/automatable.cc | 70 |
1 files changed, 39 insertions, 31 deletions
diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 51a58ce942..981c4b571f 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -614,47 +614,55 @@ Automatable::clear_controls () } bool -Automatable::find_next_event (double now, double end, Evoral::ControlEvent& next_event, bool only_active) const +Automatable::find_next_event (double start, double end, Evoral::ControlEvent& next_event, bool only_active) const { - Controls::const_iterator li; - next_event.when = std::numeric_limits<double>::max(); - for (li = _controls.begin(); li != _controls.end(); ++li) { - boost::shared_ptr<AutomationControl> c - = boost::dynamic_pointer_cast<AutomationControl>(li->second); - - if (only_active && (!c || !c->automation_playback())) { - continue; + if (only_active) { + boost::shared_ptr<ControlList> cl = _automated_controls.reader (); + for (ControlList::const_iterator ci = cl->begin(); ci != cl->end(); ++ci) { + if ((*ci)->automation_playback()) { + find_next_ac_event (*ci, start, end, next_event); + } + } + } else { + for (Controls::const_iterator li = _controls.begin(); li != _controls.end(); ++li) { + boost::shared_ptr<AutomationControl> c + = boost::dynamic_pointer_cast<AutomationControl>(li->second); + if (c) { + find_next_ac_event (c, start, end, next_event); + } } + } + return next_event.when != std::numeric_limits<double>::max(); +} - boost::shared_ptr<SlavableAutomationControl> sc - = boost::dynamic_pointer_cast<SlavableAutomationControl>(li->second); +void +Automatable::find_next_ac_event (boost::shared_ptr<AutomationControl> c, double start, double end, Evoral::ControlEvent& next_event) const +{ + boost::shared_ptr<SlavableAutomationControl> sc + = boost::dynamic_pointer_cast<SlavableAutomationControl>(c); - if (sc) { - sc->find_next_event (now, end, next_event); - } + if (sc) { + sc->find_next_event (start, end, next_event); + } - Evoral::ControlList::const_iterator i; - boost::shared_ptr<const Evoral::ControlList> alist (li->second->list()); - Evoral::ControlEvent cp (now, 0.0f); - if (!alist) { - continue; - } + Evoral::ControlList::const_iterator i; + boost::shared_ptr<const Evoral::ControlList> alist (c->list()); + Evoral::ControlEvent cp (start, 0.0f); + if (!alist) { + return; + } - for (i = lower_bound (alist->begin(), alist->end(), &cp, Evoral::ControlList::time_comparator); - i != alist->end() && (*i)->when < end; ++i) { - if ((*i)->when > now) { - break; - } + for (i = lower_bound (alist->begin(), alist->end(), &cp, Evoral::ControlList::time_comparator); i != alist->end() && (*i)->when < end; ++i) { + if ((*i)->when > start) { + break; } + } - if (i != alist->end() && (*i)->when < end) { - if ((*i)->when < next_event.when) { - next_event.when = (*i)->when; - } + if (i != alist->end() && (*i)->when < end) { + if ((*i)->when < next_event.when) { + next_event.when = (*i)->when; } } - - return next_event.when != std::numeric_limits<double>::max(); } |