diff options
author | Robin Gareus <robin@gareus.org> | 2015-10-07 10:42:28 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-10-07 14:21:29 +0200 |
commit | 96b45d49099069981109d8f3f292ad1024649f61 (patch) | |
tree | f948f8e9e346d8ac2a581642ddbce032ba5a740b /libs/ardour/automatable.cc | |
parent | 5fd4ee3ef1c422b3907e2a531c10d5c4d7d60674 (diff) |
only subdivide plugin-cycle when automation is playing
PluginInsert::automation_run() subdivides plugin-run on every
control-port automation event (without splitting the process cycle).
libevoral has no automation-control context, hence this function
must be implemented by Automatable.
Diffstat (limited to 'libs/ardour/automatable.cc')
-rw-r--r-- | libs/ardour/automatable.cc | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index e0c21a6f6f..0b316890bc 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -501,3 +501,42 @@ Automatable::value_as_string (boost::shared_ptr<AutomationControl> ac) const { return ARDOUR::value_as_string(ac->desc(), ac->get_value()); } + +bool +Automatable::find_next_event (double now, 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; + } + + Evoral::ControlList::const_iterator i; + boost::shared_ptr<const Evoral::ControlList> alist (li->second->list()); + Evoral::ControlEvent cp (now, 0.0f); + if (!alist) { + continue; + } + + 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; + } + } + + 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(); +} |