diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-06-17 14:01:58 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-06-17 14:01:58 +0000 |
commit | f2fddb626acfc7f6393948f9a7e40c47c3ede8b2 (patch) | |
tree | 43465e3a3b2929f804585e00645433c7c7278bbc /libs/ardour/redirect.cc | |
parent | c3460fb11c39fc370eaca29579045640b78cdf52 (diff) |
fix deep design problem with redirect parameter automation being handled as a non-thread safe map - shift back to a predefined-size vector. Basically bugs #2198 and likely #2199
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3465 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/redirect.cc')
-rw-r--r-- | libs/ardour/redirect.cc | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/libs/ardour/redirect.cc b/libs/ardour/redirect.cc index afb166b8cb..42195ba47f 100644 --- a/libs/ardour/redirect.cc +++ b/libs/ardour/redirect.cc @@ -156,17 +156,20 @@ Redirect::get_automation_state () return *node; } - map<uint32_t,AutomationList*>::iterator li; - - for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) { + vector<AutomationList*>::iterator li; + uint32_t n; + + for (n = 0, li = parameter_automation.begin(); li != parameter_automation.end(); ++li, ++n) { - XMLNode* child; - - char buf[64]; - stringstream str; - snprintf (buf, sizeof (buf), "parameter-%" PRIu32, li->first); - child = new XMLNode (buf); - child->add_child_nocopy (li->second->get_state ()); + if (*li) { + XMLNode* child; + + char buf[64]; + stringstream str; + snprintf (buf, sizeof (buf), "parameter-%" PRIu32, n); + child = new XMLNode (buf); + child->add_child_nocopy ((*li)->get_state ()); + } } return *node; @@ -384,10 +387,13 @@ void Redirect::what_has_automation (set<uint32_t>& s) const { Glib::Mutex::Lock lm (_automation_lock); - map<uint32_t,AutomationList*>::const_iterator li; - - for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) { - s.insert ((*li).first); + vector<AutomationList*>::const_iterator li; + uint32_t n; + + for (n = 0, li = parameter_automation.begin(); li != parameter_automation.end(); ++li, ++n) { + if (*li) { + s.insert (n); + } } } @@ -401,11 +407,12 @@ Redirect::what_has_visible_automation (set<uint32_t>& s) const s.insert (*li); } } + AutomationList& Redirect::automation_list (uint32_t parameter) { AutomationList* al = parameter_automation[parameter]; - + if (al == 0) { al = parameter_automation[parameter] = new AutomationList (default_parameter_value (parameter)); /* let derived classes do whatever they need with this */ @@ -445,24 +452,29 @@ Redirect::mark_automation_visible (uint32_t what, bool yn) bool Redirect::find_next_event (nframes_t now, nframes_t end, ControlEvent& next_event) const { - map<uint32_t,AutomationList*>::const_iterator li; + vector<AutomationList*>::const_iterator li; AutomationList::TimeComparator cmp; next_event.when = max_frames; for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) { + + const AutomationList* alist = *li; + + if (!alist) { + continue; + } AutomationList::const_iterator i; - const AutomationList& alist (*((*li).second)); ControlEvent cp (now, 0.0f); - for (i = lower_bound (alist.const_begin(), alist.const_end(), &cp, cmp); i != alist.const_end() && (*i)->when < end; ++i) { + for (i = lower_bound (alist->const_begin(), alist->const_end(), &cp, cmp); i != alist->const_end() && (*i)->when < end; ++i) { if ((*i)->when > now) { break; } } - if (i != alist.const_end() && (*i)->when < end) { + if (i != alist->const_end() && (*i)->when < end) { if ((*i)->when < next_event.when) { next_event.when = (*i)->when; |