summaryrefslogtreecommitdiff
path: root/libs/ardour/automatable.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-12-16 04:07:55 +0100
committerRobin Gareus <robin@gareus.org>2018-12-16 04:25:24 +0100
commit6b1b72a247bf04c81292fc41af4f69c9b7f90379 (patch)
tree9d5757acb39b406ae0215ec692c0cd58d843b2ff /libs/ardour/automatable.cc
parente4d3ebfb666e2c4e9cf134d8f3ed42152da343bf (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.cc70
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();
}