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 | |
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')
-rw-r--r-- | libs/ardour/ardour/redirect.h | 4 | ||||
-rw-r--r-- | libs/ardour/insert.cc | 52 | ||||
-rw-r--r-- | libs/ardour/redirect.cc | 50 |
3 files changed, 62 insertions, 44 deletions
diff --git a/libs/ardour/ardour/redirect.h b/libs/ardour/ardour/redirect.h index 6dcc105370..ec0006c2ce 100644 --- a/libs/ardour/ardour/redirect.h +++ b/libs/ardour/ardour/redirect.h @@ -23,7 +23,6 @@ #include <string> #include <vector> #include <set> -#include <map> #include <boost/shared_ptr.hpp> #include <sigc++/signal.h> @@ -35,7 +34,6 @@ #include <ardour/io.h> #include <ardour/automation_event.h> -using std::map; using std::set; using std::string; using std::vector; @@ -112,7 +110,7 @@ class Redirect : public IO protected: /* children may use this stuff as they see fit */ - map<uint32_t,AutomationList*> parameter_automation; + std::vector<AutomationList*> parameter_automation; set<uint32_t> visible_parameter_automation; mutable Glib::Mutex _automation_lock; diff --git a/libs/ardour/insert.cc b/libs/ardour/insert.cc index 90448661e8..75f428aeb4 100644 --- a/libs/ardour/insert.cc +++ b/libs/ardour/insert.cc @@ -90,8 +90,6 @@ PluginInsert::PluginInsert (Session& s, const XMLNode& node) throw failed_constructor(); } - set_automatable (); - _plugins[0]->ParameterChanged.connect (mem_fun (*this, &PluginInsert::parameter_changed)); } @@ -149,8 +147,6 @@ void PluginInsert::init () { set_automatable (); - - set<uint32_t>::iterator s; } PluginInsert::~PluginInsert () @@ -223,6 +219,10 @@ PluginInsert::is_generator() const void PluginInsert::set_automatable () { + /* fill the parameter automation list with null AutomationLists */ + + parameter_automation.assign (_plugins.front()->parameter_count(), (AutomationList*) 0); + set<uint32_t> a; a = _plugins.front()->automatable (); @@ -283,21 +283,21 @@ PluginInsert::connect_and_run (vector<Sample*>& bufs, uint32_t nbufs, nframes_t if (with_auto) { - map<uint32_t,AutomationList*>::iterator li; + vector<AutomationList*>::iterator li; uint32_t n; for (n = 0, li = parameter_automation.begin(); li != parameter_automation.end(); ++li, ++n) { - AutomationList& alist (*((*li).second)); + AutomationList* alist = *li; - if (alist.automation_playback()) { + if (alist && alist->automation_playback()) { bool valid; - float val = alist.rt_safe_eval (now, valid); + float val = alist->rt_safe_eval (now, valid); if (valid) { /* set the first plugin, the others will be set via signals */ - _plugins[0]->set_parameter ((*li).first, val); + _plugins[0]->set_parameter (n, val); } } @@ -314,14 +314,16 @@ PluginInsert::connect_and_run (vector<Sample*>& bufs, uint32_t nbufs, nframes_t void PluginInsert::automation_snapshot (nframes_t now, bool force) { - 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) { - AutomationList *alist = ((*li).second); - if (alist != 0 && alist->automation_write ()) { + AutomationList *alist = *li; + + if (alist && alist->automation_write ()) { - float val = _plugins[0]->get_parameter ((*li).first); + float val = _plugins[0]->get_parameter (n); alist->rt_add (now, val); last_automation_snapshot = now; } @@ -331,14 +333,18 @@ PluginInsert::automation_snapshot (nframes_t now, bool force) void PluginInsert::transport_stopped (nframes_t now) { - map<uint32_t,AutomationList*>::iterator li; + vector<AutomationList*>::iterator li; + uint32_t n; - for (li = parameter_automation.begin(); li != parameter_automation.end(); ++li) { - AutomationList& alist (*(li->second)); - alist.reposition_for_rt_add (now); + for (n = 0, li = parameter_automation.begin(); li != parameter_automation.end(); ++li, ++n) { - if (alist.automation_state() != Off) { - _plugins[0]->set_parameter (li->first, alist.eval (now)); + AutomationList* alist = *li; + + if (alist) { + alist->reposition_for_rt_add (now); + if (alist->automation_state() != Off) { + _plugins[0]->set_parameter (n, alist->eval (now)); + } } } } @@ -692,7 +698,7 @@ PluginInsert::set_state(const XMLNode& node) _plugins.push_back (plugin_factory (plugin)); } } - + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { if ((*niter)->name() == plugin->state_node_name()) { for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { @@ -743,6 +749,8 @@ PluginInsert::set_state(const XMLNode& node) break; } + set_automatable (); + /* look for port automation node */ for (niter = nlist.begin(); niter != nlist.end(); ++niter) { 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; |