summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2008-06-17 14:01:58 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2008-06-17 14:01:58 +0000
commitf2fddb626acfc7f6393948f9a7e40c47c3ede8b2 (patch)
tree43465e3a3b2929f804585e00645433c7c7278bbc /libs/ardour
parentc3460fb11c39fc370eaca29579045640b78cdf52 (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.h4
-rw-r--r--libs/ardour/insert.cc52
-rw-r--r--libs/ardour/redirect.cc50
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;