use XML state to store processors in mixer (strips) and fixup crash caused by missing AutomationController for integer LADSPA plugin params

git-svn-id: svn://localhost/ardour2/trunk@2215 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2007-08-01 22:18:46 +00:00
parent 4d1542d1e5
commit 6698f5f686
16 changed files with 136 additions and 195 deletions

View file

@ -197,6 +197,11 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
keybindings_path = key_bindings_file.to_string(); keybindings_path = key_bindings_file.to_string();
/* store all bindings changes in per-user file, no matter where they were loaded from */
user_keybindings_path = user_config_directory().to_string ();
user_keybindings_path += '/';
user_keybindings_path += "ardour.bindings";
can_save_keybindings = false; can_save_keybindings = false;
last_configure_time.tv_sec = 0; last_configure_time.tv_sec = 0;
@ -2724,7 +2729,7 @@ void
ARDOUR_UI::save_keybindings () ARDOUR_UI::save_keybindings ()
{ {
if (can_save_keybindings) { if (can_save_keybindings) {
AccelMap::save (keybindings_path); AccelMap::save (user_keybindings_path);
} }
} }

View file

@ -577,6 +577,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void we_have_dependents (); void we_have_dependents ();
std::string keybindings_path; std::string keybindings_path;
std::string user_keybindings_path;
void setup_keybindings (); void setup_keybindings ();
void setup_session_options (); void setup_session_options ();

View file

@ -835,7 +835,11 @@ void
ARDOUR_UI::sync_option_changed () ARDOUR_UI::sync_option_changed ()
{ {
if (session) { if (session) {
session->request_slave_source (string_to_slave_source (sync_option_combo.get_active_text())); ustring txt = sync_option_combo.get_active_text ();
if (txt.length()) {
cerr << "Changing to slave source based on " << txt << endl;
session->request_slave_source (string_to_slave_source (txt));
}
} }
} }

View file

@ -90,6 +90,8 @@ ARDOUR_UI::setup_keybindings ()
GtkAccelMap* accelmap = gtk_accel_map_get(); GtkAccelMap* accelmap = gtk_accel_map_get();
g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this); g_signal_connect (accelmap, "changed", (GCallback) accel_map_changed, this);
} }
void void

View file

@ -80,7 +80,6 @@ ARDOUR_UI::install_actions ()
/* menus + submenus that need action items */ /* menus + submenus that need action items */
ActionManager::register_action (main_actions, X_("Session"), _("Session")); ActionManager::register_action (main_actions, X_("Session"), _("Session"));
ActionManager::register_action (main_actions, X_("Export"), _("Export"));
ActionManager::register_action (main_actions, X_("Cleanup"), _("Cleanup")); ActionManager::register_action (main_actions, X_("Cleanup"), _("Cleanup"));
ActionManager::register_action (main_actions, X_("Sync"), _("Sync")); ActionManager::register_action (main_actions, X_("Sync"), _("Sync"));
ActionManager::register_action (main_actions, X_("Options"), _("Options")); ActionManager::register_action (main_actions, X_("Options"), _("Options"));

View file

@ -423,7 +423,11 @@ LadspaPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automati
return control_ui; return control_ui;
} }
/* create the controller */
control_ui->controller = AutomationController::create(insert, mcontrol->list(), mcontrol);
/* XXX this code is not right yet, because it doesn't handle /* XXX this code is not right yet, because it doesn't handle
the absence of bounds in any sensible fashion. the absence of bounds in any sensible fashion.
*/ */
@ -456,7 +460,6 @@ LadspaPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automati
} else { } else {
//sigc::slot<void,char*,uint32_t> pslot = sigc::bind (mem_fun(*this, &LadspaPluginUI::print_parameter), (uint32_t) port_index); //sigc::slot<void,char*,uint32_t> pslot = sigc::bind (mem_fun(*this, &LadspaPluginUI::print_parameter), (uint32_t) port_index);
control_ui->controller = AutomationController::create(insert, mcontrol->list(), mcontrol);
control_ui->controller->set_size_request (200, req.height); control_ui->controller->set_size_request (200, req.height);
control_ui->controller->set_name (X_("PluginSlider")); control_ui->controller->set_name (X_("PluginSlider"));
control_ui->controller->set_style (BarController::LeftToRight); control_ui->controller->set_style (BarController::LeftToRight);

View file

@ -739,39 +739,38 @@ void
ProcessorBox::cut_processors () ProcessorBox::cut_processors ()
{ {
vector<boost::shared_ptr<Processor> > to_be_removed; vector<boost::shared_ptr<Processor> > to_be_removed;
XMLNode* node = new XMLNode (X_("cut"));
get_selected_processors (to_be_removed); get_selected_processors (to_be_removed);
if (to_be_removed.empty()) { if (to_be_removed.empty()) {
return; return;
} }
/* this essentially transfers ownership of the processor
of the processor from the route to the mixer
selection.
*/
_rr_selection.set (to_be_removed);
no_processor_redisplay = true; no_processor_redisplay = true;
for (vector<boost::shared_ptr<Processor> >::iterator i = to_be_removed.begin(); i != to_be_removed.end(); ++i) { for (vector<boost::shared_ptr<Processor> >::iterator i = to_be_removed.begin(); i != to_be_removed.end(); ++i) {
// Do not cut processors or sends // Do not cut inserts or sends
if (boost::dynamic_pointer_cast<PluginInsert>((*i)) != 0) { if (boost::dynamic_pointer_cast<PluginInsert>((*i)) != 0) {
void* gui = (*i)->get_gui (); void* gui = (*i)->get_gui ();
if (gui) { if (gui) {
static_cast<Gtk::Widget*>(gui)->hide (); static_cast<Gtk::Widget*>(gui)->hide ();
} }
if (_route->remove_processor (*i)) { XMLNode& child ((*i)->get_state());
/* removal failed */
_rr_selection.remove (*i);
}
} else {
_rr_selection.remove (*i);
}
if (_route->remove_processor (*i) == 0) {
/* success */
node->add_child_nocopy (child);
} else {
delete &child;
}
}
} }
_rr_selection.set (node);
no_processor_redisplay = false; no_processor_redisplay = false;
redisplay_processors (); redisplay_processors ();
} }
@ -780,7 +779,7 @@ void
ProcessorBox::copy_processors () ProcessorBox::copy_processors ()
{ {
vector<boost::shared_ptr<Processor> > to_be_copied; vector<boost::shared_ptr<Processor> > to_be_copied;
vector<boost::shared_ptr<Processor> > copies; XMLNode* node = new XMLNode (X_("copy"));
get_selected_processors (to_be_copied); get_selected_processors (to_be_copied);
@ -791,12 +790,11 @@ ProcessorBox::copy_processors ()
for (vector<boost::shared_ptr<Processor> >::iterator i = to_be_copied.begin(); i != to_be_copied.end(); ++i) { for (vector<boost::shared_ptr<Processor> >::iterator i = to_be_copied.begin(); i != to_be_copied.end(); ++i) {
// Do not copy processors or sends // Do not copy processors or sends
if (boost::dynamic_pointer_cast<PluginInsert>((*i)) != 0) { if (boost::dynamic_pointer_cast<PluginInsert>((*i)) != 0) {
copies.push_back (Processor::clone (*i)); node->add_child_nocopy ((*i)->get_state());
} }
} }
_rr_selection.set (copies); _rr_selection.set (node);
} }
void void
@ -868,37 +866,6 @@ ProcessorBox::rename_processor (boost::shared_ptr<Processor> processor)
return; return;
} }
void
ProcessorBox::cut_processor (boost::shared_ptr<Processor> processor)
{
/* this essentially transfers ownership of the processor
of the processor from the route to the mixer
selection.
*/
_rr_selection.add (processor);
void* gui = processor->get_gui ();
if (gui) {
static_cast<Gtk::Widget*>(gui)->hide ();
}
no_processor_redisplay = true;
if (_route->remove_processor (processor)) {
_rr_selection.remove (processor);
}
no_processor_redisplay = false;
redisplay_processors ();
}
void
ProcessorBox::copy_processor (boost::shared_ptr<Processor> processor)
{
boost::shared_ptr<Processor> copy = Processor::clone (processor);
_rr_selection.add (copy);
}
void void
ProcessorBox::paste_processors () ProcessorBox::paste_processors ()
{ {
@ -906,20 +873,58 @@ ProcessorBox::paste_processors ()
return; return;
} }
paste_processor_list (_rr_selection.processors); cerr << "paste from node called " << _rr_selection.processors.get_node().name() << endl;
paste_processor_state (_rr_selection.processors.get_node());
} }
void void
ProcessorBox::paste_processor_list (list<boost::shared_ptr<Processor> >& processors) ProcessorBox::paste_processor_list (list<boost::shared_ptr<Processor> >& processors)
{ {
list<boost::shared_ptr<Processor> > copies; list<boost::shared_ptr<Processor> > copies;
for (list<boost::shared_ptr<Processor> >::iterator i = processors.begin(); i != processors.end(); ++i) { for (list<boost::shared_ptr<Processor> >::iterator i = processors.begin(); i != processors.end(); ++i) {
boost::shared_ptr<Processor> copy = Processor::clone (*i); boost::shared_ptr<Processor> copy = Processor::clone (*i);
copy->set_placement (_placement); copy->set_placement (_placement);
copies.push_back (copy); copies.push_back (copy);
}
if (_route->add_processors (copies)) {
string msg = _(
"Copying the set of processors on the clipboard failed,\n\
probably because the I/O configuration of the plugins\n\
could not match the configuration of this track.");
MessageDialog am (msg);
am.run ();
}
}
void
ProcessorBox::paste_processor_state (const XMLNode& node)
{
XMLNodeList nlist;
XMLNodeConstIterator niter;
list<boost::shared_ptr<Processor> > copies;
nlist = node.children();
cerr << "Pasting processor selection containing " << nlist.size() << endl;
if (nlist.empty()) {
return;
}
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
cerr << "try using " << (*niter)->name() << endl;
try {
copies.push_back (boost::shared_ptr<Processor> (new PluginInsert (_session, **niter)));
}
catch (...) {
cerr << "plugin insert constructor failed\n";
}
} }
if (_route->add_processors (copies)) { if (_route->add_processors (copies)) {

View file

@ -186,11 +186,10 @@ class ProcessorBox : public Gtk::HBox
static Glib::RefPtr<Gtk::Action> paste_action; static Glib::RefPtr<Gtk::Action> paste_action;
void paste_processor_list (std::list<boost::shared_ptr<ARDOUR::Processor> >& processors); void paste_processor_list (std::list<boost::shared_ptr<ARDOUR::Processor> >& processors);
void paste_processor_state (const XMLNode&);
void activate_processor (boost::shared_ptr<ARDOUR::Processor>); void activate_processor (boost::shared_ptr<ARDOUR::Processor>);
void deactivate_processor (boost::shared_ptr<ARDOUR::Processor>); void deactivate_processor (boost::shared_ptr<ARDOUR::Processor>);
void cut_processor (boost::shared_ptr<ARDOUR::Processor>);
void copy_processor (boost::shared_ptr<ARDOUR::Processor>);
void edit_processor (boost::shared_ptr<ARDOUR::Processor>); void edit_processor (boost::shared_ptr<ARDOUR::Processor>);
void hide_processor_editor (boost::shared_ptr<ARDOUR::Processor>); void hide_processor_editor (boost::shared_ptr<ARDOUR::Processor>);
void rename_processor (boost::shared_ptr<ARDOUR::Processor>); void rename_processor (boost::shared_ptr<ARDOUR::Processor>);

View file

@ -20,13 +20,40 @@
#ifndef __ardour_gtk_processor_selection_h__ #ifndef __ardour_gtk_processor_selection_h__
#define __ardour_gtk_processor_selection_h__ #define __ardour_gtk_processor_selection_h__
#include <list> #include <pbd/xml++.h>
#include <boost/shared_ptr.hpp>
namespace ARDOUR { class ProcessorSelection {
class Processor; public:
} ProcessorSelection() : node (0) {}
~ProcessorSelection() { if (node) { delete node; } }
struct ProcessorSelection : list<boost::shared_ptr<ARDOUR::Processor> > {}; void set (XMLNode* n) {
if (node) {
delete node;
}
node = n;
}
void add (XMLNode* newchild) {
if (!node) {
node = new XMLNode ("add");
}
node->add_child_nocopy (*newchild);
}
void clear () {
if (node) {
delete node;
node = 0;
}
}
bool empty () const { return node == 0 || node->children().empty(); }
const XMLNode& get_node() const { return *node; }
private:
XMLNode* node;
};
#endif /* __ardour_gtk_processor_selection_h__ */ #endif /* __ardour_gtk_processor_selection_h__ */

View file

@ -46,8 +46,8 @@ RouteRedirectSelection::operator= (const RouteRedirectSelection& other)
bool bool
operator== (const RouteRedirectSelection& a, const RouteRedirectSelection& b) operator== (const RouteRedirectSelection& a, const RouteRedirectSelection& b)
{ {
return a.processors == b.processors && // XXX MUST TEST PROCESSORS SOMEHOW
a.routes == b.routes; return a.routes == b.routes;
} }
void void
@ -72,63 +72,19 @@ RouteRedirectSelection::clear_routes ()
} }
void void
RouteRedirectSelection::add (boost::shared_ptr<Processor> r) RouteRedirectSelection::add (XMLNode* node)
{ {
if (find (processors.begin(), processors.end(), r) == processors.end()) { // XXX check for duplicate
processors.push_back (r); processors.add (node);
ProcessorsChanged();
// XXX SHAREDPTR FIXME
// void (RouteRedirectSelection::*pmf)(Redirect*) = &RouteRedirectSelection::remove;
// r->GoingAway.connect (mem_fun(*this, pmf));
ProcessorsChanged();
}
} }
void void
RouteRedirectSelection::add (const vector<boost::shared_ptr<Processor> >& rlist) RouteRedirectSelection::set (XMLNode* node)
{
bool changed = false;
for (vector<boost::shared_ptr<Processor> >::const_iterator i = rlist.begin(); i != rlist.end(); ++i) {
if (find (processors.begin(), processors.end(), *i) == processors.end()) {
processors.push_back (*i);
// XXX SHAREDPTR FIXME
//void (RouteRedirectSelection::*pmf)(Redirect*) = &RouteRedirectSelection::remove;
// (*i)->GoingAway.connect (mem_fun(*this, pmf));
changed = true;
}
}
if (changed) {
ProcessorsChanged();
}
}
void
RouteRedirectSelection::remove (boost::shared_ptr<Processor> r)
{
list<boost::shared_ptr<Processor> >::iterator i;
if ((i = find (processors.begin(), processors.end(), r)) != processors.end()) {
processors.erase (i);
ProcessorsChanged ();
}
}
void
RouteRedirectSelection::set (boost::shared_ptr<Processor> r)
{ {
clear_processors (); clear_processors ();
add (r); processors.set (node);
} ProcessorsChanged ();
void
RouteRedirectSelection::set (const vector<boost::shared_ptr<Processor> >& rlist)
{
clear_processors ();
add (rlist);
} }
void void

View file

@ -42,11 +42,8 @@ class RouteRedirectSelection : public sigc::trackable
void clear (); void clear ();
bool empty(); bool empty();
void set (boost::shared_ptr<ARDOUR::Processor>); void set (XMLNode* node);
void set (const std::vector<boost::shared_ptr<ARDOUR::Processor> >&); void add (XMLNode* node);
void add (boost::shared_ptr<ARDOUR::Processor>);
void add (const std::vector<boost::shared_ptr<ARDOUR::Processor> >&);
void remove (boost::shared_ptr<ARDOUR::Processor>);
void set (boost::shared_ptr<ARDOUR::Route>); void set (boost::shared_ptr<ARDOUR::Route>);
void add (boost::shared_ptr<ARDOUR::Route>); void add (boost::shared_ptr<ARDOUR::Route>);

View file

@ -63,8 +63,7 @@ operator== (const Selection& a, const Selection& b)
a.time.group == b.time.group && a.time.group == b.time.group &&
a.time == b.time && a.time == b.time &&
a.lines == b.lines && a.lines == b.lines &&
a.playlists == b.playlists && a.playlists == b.playlists;
a.processors == b.processors;
} }
/** Clear everything from the Selection */ /** Clear everything from the Selection */
@ -77,7 +76,6 @@ Selection::clear ()
clear_lines(); clear_lines();
clear_time (); clear_time ();
clear_playlists (); clear_playlists ();
clear_processors ();
} }
void void
@ -90,15 +88,6 @@ Selection::dump_region_layers()
} }
void
Selection::clear_processors ()
{
if (!processors.empty()) {
processors.clear ();
ProcessorsChanged ();
}
}
void void
Selection::clear_regions () Selection::clear_regions ()
{ {
@ -153,20 +142,6 @@ Selection::clear_lines ()
} }
} }
void
Selection::toggle (boost::shared_ptr<Processor> r)
{
ProcessorSelection::iterator i;
if ((i = find (processors.begin(), processors.end(), r)) == processors.end()) {
processors.push_back (r);
} else {
processors.erase (i);
}
ProcessorsChanged();
}
void void
Selection::toggle (boost::shared_ptr<Playlist> pl) Selection::toggle (boost::shared_ptr<Playlist> pl)
{ {
@ -252,16 +227,6 @@ Selection::toggle (nframes_t start, nframes_t end)
return next_time_id - 1; return next_time_id - 1;
} }
void
Selection::add (boost::shared_ptr<Processor> i)
{
if (find (processors.begin(), processors.end(), i) == processors.end()) {
processors.push_back (i);
ProcessorsChanged();
}
}
void void
Selection::add (boost::shared_ptr<Playlist> pl) Selection::add (boost::shared_ptr<Playlist> pl)
{ {
@ -394,16 +359,6 @@ Selection::add (AutomationList* ac)
} }
} }
void
Selection::remove (boost::shared_ptr<Processor> r)
{
ProcessorSelection::iterator i;
if ((i = find (processors.begin(), processors.end(), r)) != processors.end()) {
processors.erase (i);
ProcessorsChanged ();
}
}
void void
Selection::remove (TimeAxisView* track) Selection::remove (TimeAxisView* track)
{ {
@ -509,13 +464,6 @@ Selection::remove (AutomationList *ac)
} }
} }
void
Selection::set (boost::shared_ptr<Processor> i)
{
clear_processors ();
add (i);
}
void void
Selection::set (TimeAxisView* track) Selection::set (TimeAxisView* track)
{ {
@ -624,8 +572,7 @@ Selection::empty ()
playlists.empty () && playlists.empty () &&
lines.empty () && lines.empty () &&
time.empty () && time.empty () &&
playlists.empty () && playlists.empty ()
processors.empty ()
; ;
} }

View file

@ -69,7 +69,6 @@ class Selection : public sigc::trackable
TimeSelection time; TimeSelection time;
AutomationSelection lines; AutomationSelection lines;
PlaylistSelection playlists; PlaylistSelection playlists;
ProcessorSelection processors;
PointSelection points; PointSelection points;
Selection() { Selection() {
@ -84,7 +83,6 @@ class Selection : public sigc::trackable
sigc::signal<void> TimeChanged; sigc::signal<void> TimeChanged;
sigc::signal<void> LinesChanged; sigc::signal<void> LinesChanged;
sigc::signal<void> PlaylistsChanged; sigc::signal<void> PlaylistsChanged;
sigc::signal<void> ProcessorsChanged;
sigc::signal<void> PointsChanged; sigc::signal<void> PointsChanged;
void clear (); void clear ();
@ -107,7 +105,6 @@ class Selection : public sigc::trackable
void set (ARDOUR::AutomationList*); void set (ARDOUR::AutomationList*);
void set (boost::shared_ptr<ARDOUR::Playlist>); void set (boost::shared_ptr<ARDOUR::Playlist>);
void set (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&); void set (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void set (boost::shared_ptr<ARDOUR::Processor>);
void set (AutomationSelectable*); void set (AutomationSelectable*);
void toggle (TimeAxisView*); void toggle (TimeAxisView*);
@ -118,7 +115,6 @@ class Selection : public sigc::trackable
void toggle (ARDOUR::AutomationList*); void toggle (ARDOUR::AutomationList*);
void toggle (boost::shared_ptr<ARDOUR::Playlist>); void toggle (boost::shared_ptr<ARDOUR::Playlist>);
void toggle (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&); void toggle (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void toggle (boost::shared_ptr<ARDOUR::Processor>);
void toggle (const std::vector<AutomationSelectable*>&); void toggle (const std::vector<AutomationSelectable*>&);
void add (TimeAxisView*); void add (TimeAxisView*);
@ -129,7 +125,6 @@ class Selection : public sigc::trackable
void add (ARDOUR::AutomationList*); void add (ARDOUR::AutomationList*);
void add (boost::shared_ptr<ARDOUR::Playlist>); void add (boost::shared_ptr<ARDOUR::Playlist>);
void add (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&); void add (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void add (boost::shared_ptr<ARDOUR::Processor>);
void remove (TimeAxisView*); void remove (TimeAxisView*);
void remove (const std::list<TimeAxisView*>&); void remove (const std::list<TimeAxisView*>&);
@ -139,7 +134,6 @@ class Selection : public sigc::trackable
void remove (ARDOUR::AutomationList*); void remove (ARDOUR::AutomationList*);
void remove (boost::shared_ptr<ARDOUR::Playlist>); void remove (boost::shared_ptr<ARDOUR::Playlist>);
void remove (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&); void remove (const std::list<boost::shared_ptr<ARDOUR::Playlist> >&);
void remove (boost::shared_ptr<ARDOUR::Processor>);
void remove (const list<Selectable*>&); void remove (const list<Selectable*>&);
void replace (uint32_t time_index, nframes_t start, nframes_t end); void replace (uint32_t time_index, nframes_t start, nframes_t end);
@ -149,7 +143,6 @@ class Selection : public sigc::trackable
void clear_time(); void clear_time();
void clear_lines (); void clear_lines ();
void clear_playlists (); void clear_playlists ();
void clear_processors ();
void clear_points (); void clear_points ();
void foreach_region (void (ARDOUR::Region::*method)(void)); void foreach_region (void (ARDOUR::Region::*method)(void));

View file

@ -59,8 +59,14 @@ class PluginInfo {
public: public:
PluginInfo () { } PluginInfo () { }
PluginInfo (const PluginInfo &o) PluginInfo (const PluginInfo &o)
: name(o.name), n_inputs(o.n_inputs), n_outputs(o.n_outputs), : name(o.name),
path (o.path), unique_id(o.unique_id), index(o.index) {} category (o.category),
creator (o.creator),
path (o.path),
n_inputs(o.n_inputs),
n_outputs(o.n_outputs),
unique_id(o.unique_id),
index(o.index) {}
virtual ~PluginInfo () { } virtual ~PluginInfo () { }
string name; string name;

View file

@ -125,8 +125,6 @@ Automatable::add_control(boost::shared_ptr<AutomationControl> ac)
_controls[param] = ac; _controls[param] = ac;
cerr << _name << ": added parameter " << param.to_string() << endl;
_can_automate_list.insert(param); _can_automate_list.insert(param);
// Sync everything (derived classes) up to initial values // Sync everything (derived classes) up to initial values
@ -459,7 +457,6 @@ Automatable::control_factory(boost::shared_ptr<AutomationList> list)
// FIXME: this will die horribly if this is not a MidiTrack // FIXME: this will die horribly if this is not a MidiTrack
return boost::shared_ptr<AutomationControl>(new MidiTrack::MidiControl((MidiTrack*)this, list)); return boost::shared_ptr<AutomationControl>(new MidiTrack::MidiControl((MidiTrack*)this, list));
} else { } else {
cerr << "WARNING: Default AutomationControl created for " << list->parameter().to_string() << endl;
return boost::shared_ptr<AutomationControl>(new AutomationControl(_session, list)); return boost::shared_ptr<AutomationControl>(new AutomationControl(_session, list));
} }
} }

View file

@ -76,7 +76,7 @@ PluginInsert::PluginInsert (Session& s, const XMLNode& node)
throw failed_constructor(); throw failed_constructor();
} }
set_automatable (); // set_automatable ();
{ {
Glib::Mutex::Lock em (_session.engine().process_lock()); Glib::Mutex::Lock em (_session.engine().process_lock());