diff options
author | Robin Gareus <robin@gareus.org> | 2017-05-30 15:13:37 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-05-30 15:13:37 +0200 |
commit | 67f9f6fd75c0786d413705ad83ffc1d878eda52e (patch) | |
tree | 1308e6229658a74fef92cc263dfd66cc39369ca5 /libs/ardour/slavable_automation_control.cc | |
parent | da021ef08f70f61acfab9bd29a0d179b5ddc3cf4 (diff) |
Prepare for automation control master
Basic infrastructure to allow VCA automation and Trim automation:
look up events during automation playback.
Diffstat (limited to 'libs/ardour/slavable_automation_control.cc')
-rw-r--r-- | libs/ardour/slavable_automation_control.cc | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/libs/ardour/slavable_automation_control.cc b/libs/ardour/slavable_automation_control.cc index c06d8db7a5..51b2d30004 100644 --- a/libs/ardour/slavable_automation_control.cc +++ b/libs/ardour/slavable_automation_control.cc @@ -345,6 +345,54 @@ SlavableAutomationControl::clear_masters () } bool +SlavableAutomationControl::find_next_event (double now, double end, Evoral::ControlEvent& next_event) const +{ + Glib::Threads::RWLock::ReaderLock lm (master_lock); + if (_masters.empty()) { + return false; + } + bool rv = false; + /* iterate over all masters check their automation lists + * for any event between "now" and "end" which is earlier than + * next_event.when. If found, set next_event.when and return true. + * (see also Automatable::find_next_event) + */ + for (Masters::const_iterator mr = _masters.begin(); mr != _masters.end(); ++mr) { + boost::shared_ptr<AutomationControl> ac (mr->second.master()); + + boost::shared_ptr<SlavableAutomationControl> sc + = boost::dynamic_pointer_cast<SlavableAutomationControl>(ac); + + if (sc && sc->find_next_event (now, end, next_event)) { + rv = true; + } + + Evoral::ControlList::const_iterator i; + boost::shared_ptr<const Evoral::ControlList> alist (ac->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; + rv = true; + } + } + } + + return rv; +} + +bool SlavableAutomationControl::slaved_to (boost::shared_ptr<AutomationControl> m) const { Glib::Threads::RWLock::ReaderLock lm (master_lock); |