use image cursors for left/right trim cursors
[ardour.git] / gtk2_ardour / generic_pluginui.cc
index 56fa8483b7ad66db2d3466d5ff61a7c747cf8cc1..04e753bf0cee5836c17b900a817564466af9acc5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2000 Paul Davis 
+    Copyright (C) 2000 Paul Davis
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 
 */
 
+#ifdef WAF_BUILD
+#include "gtk2ardour-config.h"
+#endif
+
 #include <climits>
 #include <cerrno>
 #include <cmath>
 #include <string>
 
-#include <pbd/stl_delete.h>
-#include <pbd/xml++.h>
-#include <pbd/failed_constructor.h>
+#include "pbd/stl_delete.h"
+#include "pbd/xml++.h"
+#include "pbd/failed_constructor.h"
 
 #include <gtkmm2ext/click_box.h>
 #include <gtkmm2ext/fastmeter.h>
 #include <gtkmm2ext/doi.h>
 #include <gtkmm2ext/slider_controller.h>
 
-#include <midi++/manager.h>
+#include "midi++/manager.h"
 
-#include <ardour/plugin.h>
-#include <ardour/plugin_insert.h>
-#include <ardour/ladspa_plugin.h>
-#ifdef HAVE_LV2
-#include <ardour/lv2_plugin.h>
+#include "ardour/plugin.h"
+#include "ardour/plugin_insert.h"
+#include "ardour/ladspa_plugin.h"
+#ifdef HAVE_SLV2
+#include "ardour/lv2_plugin.h"
 #endif
 
 #include <lrdf.h>
@@ -58,7 +62,6 @@ using namespace ARDOUR;
 using namespace PBD;
 using namespace Gtkmm2ext;
 using namespace Gtk;
-using namespace sigc;
 
 GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrollable)
        : PlugUIBase (pi),
@@ -72,8 +75,9 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
 {
        set_name ("PluginEditor");
        set_border_width (10);
-       set_homogeneous (false);
+       //set_homogeneous (false);
 
+       pack_start(main_contents);
        settings_box.set_homogeneous (false);
 
        HBox* constraint_hbox = manage (new HBox);
@@ -81,21 +85,31 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
        Label* combo_label = manage (new Label (_("<span size=\"large\">Presets</span>")));
        combo_label->set_use_markup (true);
 
-       Label* latency_label = manage (new Label (_("<span size=\"large\">Latency</span>")));
-       latency_label->set_use_markup (true);
+       latency_button.add (latency_label);
+       latency_button.signal_clicked().connect (sigc::mem_fun (*this, &PlugUIBase::latency_button_clicked));
+       set_latency_label ();
 
-       smaller_hbox->pack_start (*latency_label, false, false, 10);
-       smaller_hbox->pack_start (latency_gui, false, false, 10);
+       smaller_hbox->pack_start (latency_button, false, false, 10);
        smaller_hbox->pack_start (preset_combo, false, false);
        smaller_hbox->pack_start (save_button, false, false);
+       smaller_hbox->pack_start (bypass_button, false, true);
 
        constraint_hbox->set_spacing (5);
-       constraint_hbox->pack_start (*smaller_hbox, true, false);
-       constraint_hbox->pack_end (bypass_button, false, false);
+       constraint_hbox->set_homogeneous (false);
+
+       VBox* v1_box = manage (new VBox);
+       VBox* v2_box = manage (new VBox);
+       pack_end(plugin_analysis_expander);
 
-       settings_box.pack_end (*constraint_hbox, false, false);
+       v1_box->pack_start (*smaller_hbox, false, true);
+       v2_box->pack_start (focus_button, false, true);
 
-       pack_start (settings_box, false, false);
+       main_contents.pack_start (settings_box, false, false);
+
+       constraint_hbox->pack_end (*v2_box, false, false);
+       constraint_hbox->pack_end (*v1_box, false, false);
+
+       main_contents.pack_start (*constraint_hbox, false, false);
 
        if ( is_scrollable ) {
                scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
@@ -103,18 +117,18 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
                scroller_view.set_name("PluginEditor");
                scroller_view.add (hpacker);
                scroller.add (scroller_view);
-               
-               pack_start (scroller, true, true);
+
+               main_contents.pack_start (scroller, true, true);
 
        }
        else {
-               pack_start (hpacker, false, false);
+               main_contents.pack_start (hpacker, false, false);
        }
 
-       pi->ActiveChanged.connect (bind(mem_fun(*this, &GenericPluginUI::processor_active_changed),
-                               boost::weak_ptr<Processor>(pi)));
+       pi->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&GenericPluginUI::processor_active_changed, this, boost::weak_ptr<Processor>(pi)), gui_context());
+
        bypass_button.set_active (!pi->active());
-       
+
        build ();
 }
 
@@ -182,7 +196,7 @@ GenericPluginUI::build ()
        for (i = 0; i < plugin->parameter_count(); ++i) {
 
                if (plugin->parameter_is_control (i)) {
-                       
+
                        /* Don't show latency control ports */
 
                        if (plugin->describe_parameter (Evoral::Parameter(PluginAutomation, 0, i)) == X_("latency")) {
@@ -190,15 +204,15 @@ GenericPluginUI::build ()
                        }
 
                        ControlUI* cui;
-       
+
                        /* if we are scrollable, just use one long column */
 
                        if (!is_scrollable) {
-                               if (x++ > 7){
+                               if (x++ > 20){
                                        frame = manage (new Frame);
                                        frame->set_name ("BaseFrame");
                                        box = manage (new VBox);
-                                       
+
                                        box->set_border_width (5);
                                        box->set_spacing (1);
 
@@ -211,13 +225,13 @@ GenericPluginUI::build ()
 
                        boost::shared_ptr<ARDOUR::AutomationControl> c
                                = boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(
-                                       insert->data().control(Evoral::Parameter(PluginAutomation, 0, i)));
+                                       insert->control(Evoral::Parameter(PluginAutomation, 0, i)));
 
                        if ((cui = build_control_ui (i, c)) == 0) {
                                error << string_compose(_("Plugin Editor: could not build control element for port %1"), i) << endmsg;
                                continue;
                        }
-                               
+
                        if (cui->controller || cui->clickbox || cui->combo) {
 
                                box->pack_start (*cui, false, false);
@@ -232,25 +246,25 @@ GenericPluginUI::build ()
                                        }
                                }
 
-                               button_table.attach (*cui, button_col, button_col + 1, button_row, button_row+1, 
+                               button_table.attach (*cui, button_col, button_col + 1, button_row, button_row+1,
                                                     FILL|EXPAND, FILL);
                                button_row++;
 
                        } else if (cui->display) {
 
-                               output_table.attach (*cui, output_col, output_col + 1, output_row, output_row+1, 
+                               output_table.attach (*cui, output_col, output_col + 1, output_row, output_row+1,
                                                     FILL|EXPAND, FILL);
-                               
-                               // TODO: The meters should be divided into multiple rows 
-                               
+
+                               // TODO: The meters should be divided into multiple rows
+
                                if (++output_col == output_cols) {
                                        output_cols ++;
                                        output_table.resize (output_rows, output_cols);
                                }
-                               
+
                                /* old code, which divides meters into
                                 * columns first, rows later. New code divides into one row
-                                
+
                                if (output_row == output_rows) {
                                        output_row = 0;
                                        if (++output_col == output_cols) {
@@ -258,22 +272,22 @@ GenericPluginUI::build ()
                                                output_table.resize (output_rows, output_cols);
                                        }
                                }
-                               
-                               output_table.attach (*cui, output_col, output_col + 1, output_row, output_row+1, 
+
+                               output_table.attach (*cui, output_col, output_col + 1, output_row, output_row+1,
                                                     FILL|EXPAND, FILL);
+
                                output_row++;
                                */
                        }
-                               
+
                        /* HACK: ideally the preferred height would be queried from
                           the complete hpacker, but I can't seem to get that
-                          information in time, so this is an estimation 
+                          information in time, so this is an estimation
                        */
 
                        prefheight += 30;
 
-               } 
+               }
        }
 
        if (box->children().empty()) {
@@ -298,17 +312,17 @@ GenericPluginUI::build ()
 }
 
 GenericPluginUI::ControlUI::ControlUI ()
-       : automate_button (X_("")) // force creation of a label 
+       : automate_button (X_("")) // force creation of a label
 {
        automate_button.set_name ("PluginAutomateButton");
-       ARDOUR_UI::instance()->tooltips().set_tip (automate_button, _("Automation control"));
+       ARDOUR_UI::instance()->set_tip (automate_button, _("Automation control"));
 
        /* XXX translators: use a string here that will be at least as long
           as the longest automation label (see ::automation_state_changed()
           below). be sure to include a descender.
        */
 
-       set_size_request_to_display_given_text (*automate_button.get_child(), _("Mgnual"), 5, 5);
+        set_size_request_to_display_given_text (automate_button, _("Mgnual"), 15, 10);
 
        ignore_change = 0;
        display = 0;
@@ -317,7 +331,7 @@ GenericPluginUI::ControlUI::ControlUI ()
        meterinfo = 0;
 }
 
-GenericPluginUI::ControlUI::~ControlUI() 
+GenericPluginUI::ControlUI::~ControlUI()
 {
        if (meterinfo) {
                delete meterinfo->meter;
@@ -353,7 +367,7 @@ GenericPluginUI::automation_state_changed (ControlUI* cui)
 }
 
 
-static void integer_printer (char buf[32], Adjustment &adj, void *arg)
+static void integer_printer (char buf[32], Adjustment &adj, void */*arg*/)
 {
        snprintf (buf, 32, "%.0f", adj.get_value());
 }
@@ -367,9 +381,10 @@ GenericPluginUI::print_parameter (char *buf, uint32_t len, uint32_t param)
 GenericPluginUI::ControlUI*
 GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<AutomationControl> mcontrol)
 {
-       ControlUI* control_ui = NULL;
-       if (!mcontrol)
+       ControlUI* control_ui = 0;
+       if (!mcontrol) {
                return control_ui;
+       }
 
        Plugin::ParameterDescriptor desc;
 
@@ -391,32 +406,32 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
        if (plugin->parameter_is_input (port_index)) {
 
                boost::shared_ptr<LadspaPlugin> lp;
-#ifdef HAVE_LV2
+#ifdef HAVE_SLV2
                boost::shared_ptr<LV2Plugin> lv2p;
 #endif
                if ((lp = boost::dynamic_pointer_cast<LadspaPlugin>(plugin)) != 0) {
-                       
+
                        // FIXME: not all plugins have a numeric unique ID
                        uint32_t id = atol (lp->unique_id().c_str());
                        lrdf_defaults* defaults = lrdf_get_scale_values(id, port_index);
-                       
+
                        if (defaults && defaults->count > 0)    {
-                               
+
                                control_ui->combo = new Gtk::ComboBoxText;
                                //control_ui->combo->set_value_in_list(true, false);
                                set_popdown_strings (*control_ui->combo, setup_scale_values(port_index, control_ui));
-                               control_ui->combo->signal_changed().connect (bind (mem_fun(*this, &GenericPluginUI::control_combo_changed), control_ui));
-                               mcontrol->Changed.connect (bind (mem_fun (*this, &GenericPluginUI::parameter_changed), control_ui));
+                               control_ui->combo->signal_changed().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_combo_changed), control_ui));
+                               mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context());
                                control_ui->pack_start(control_ui->label, true, true);
                                control_ui->pack_start(*control_ui->combo, false, true);
-                               
+
                                update_control_display(control_ui);
-                               
+
                                lrdf_free_setting_values(defaults);
                                return control_ui;
                        }
 
-#ifdef HAVE_LV2
+#ifdef HAVE_SLV2
                } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin>(plugin)) != 0) {
 
                        SLV2Port port = lv2p->slv2_port(port_index);
@@ -426,34 +441,35 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
                                control_ui->combo = new Gtk::ComboBoxText;
                                //control_ui->combo->set_value_in_list(true, false);
                                set_popdown_strings (*control_ui->combo, setup_scale_values(port_index, control_ui));
-                               control_ui->combo->signal_changed().connect (bind (mem_fun(*this, &GenericPluginUI::control_combo_changed), control_ui));
-                               mcontrol->Changed.connect (bind (mem_fun (*this, &GenericPluginUI::parameter_changed), control_ui));
+                               control_ui->combo->signal_changed().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_combo_changed), control_ui));
+                               mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context());
                                control_ui->pack_start(control_ui->label, true, true);
                                control_ui->pack_start(*control_ui->combo, false, true);
-                               
+
                                update_control_display(control_ui);
-                               
+
                                slv2_scale_points_free(points);
                                return control_ui;
                        }
 #endif
                }
-                       
+
                if (desc.toggled) {
 
                        /* Build a button */
-               
+
                        control_ui->button = manage (new ToggleButton ());
                        control_ui->button->set_name ("PluginEditorButton");
                        control_ui->button->set_size_request (20, 20);
 
                        control_ui->pack_start (control_ui->label, true, true);
                        control_ui->pack_start (*control_ui->button, false, true);
-                       control_ui->pack_start (control_ui->automate_button, false, false);
+                       // control_ui->pack_start (control_ui->automate_button, false, false);
 
-                       control_ui->button->signal_clicked().connect (bind (mem_fun(*this, &GenericPluginUI::control_port_toggled), control_ui));
-               
-                       if(plugin->get_parameter (port_index) == 1){
+                       control_ui->button->signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::control_port_toggled), control_ui));
+                       mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::toggle_parameter_changed, this, control_ui), gui_context());
+
+                       if (plugin->get_parameter (port_index) > 0.5){
                                control_ui->button->set_active(true);
                        }
 
@@ -467,10 +483,12 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
                   the absence of bounds in any sensible fashion.
                */
 
-#if 0
+//#if 0
                control_ui->controller->adjustment()->set_lower (desc.lower);
                control_ui->controller->adjustment()->set_upper (desc.upper);
 
+               control_ui->logarithmic = false; // just disable it for now
+               /*
                control_ui->logarithmic = desc.logarithmic;
                if (control_ui->logarithmic) {
                        if (control_ui->controller->adjustment()->get_lower() == 0.0) {
@@ -478,31 +496,28 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
                        }
                        control_ui->controller->adjustment()->set_upper (log(control_ui->controller->adjustment()->get_upper()));
                        control_ui->controller->adjustment()->set_lower (log(control_ui->controller->adjustment()->get_lower()));
-               }
-               
-       
-               float delta = desc.upper - desc.lower;
+               }*/
+
 
-               control_ui->controller->adjustment()->set_page_size (delta/100.0);
                control_ui->controller->adjustment()->set_step_increment (desc.step);
                control_ui->controller->adjustment()->set_page_increment (desc.largestep);
-#endif
+//#endif
 
                if (desc.integer_step) {
                        control_ui->clickbox = new ClickBox (control_ui->controller->adjustment(), "PluginUIClickBox");
                        Gtkmm2ext::set_size_request_to_display_given_text (*control_ui->clickbox, "g9999999", 2, 2);
                        control_ui->clickbox->set_print_func (integer_printer, 0);
                } else {
-                       //sigc::slot<void,char*,uint32_t> pslot = sigc::bind (mem_fun(*this, &GenericPluginUI::print_parameter), (uint32_t) port_index);
+                       //sigc::slot<void,char*,uint32_t> pslot = sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::print_parameter), (uint32_t) port_index);
 
                        control_ui->controller->set_size_request (200, req.height);
                        control_ui->controller->set_name (X_("PluginSlider"));
                        control_ui->controller->set_style (BarController::LeftToRight);
                        control_ui->controller->set_use_parent (true);
 
-                       control_ui->controller->StartGesture.connect (bind (mem_fun(*this, &GenericPluginUI::start_touch), control_ui));
-                       control_ui->controller->StopGesture.connect (bind (mem_fun(*this, &GenericPluginUI::stop_touch), control_ui));
-                       
+                       control_ui->controller->StartGesture.connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::start_touch), control_ui));
+                       control_ui->controller->StopGesture.connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::stop_touch), control_ui));
+
                }
 
                if (control_ui->logarithmic) {
@@ -524,13 +539,14 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
                }
 
                control_ui->pack_start (control_ui->automate_button, false, false);
-               control_ui->automate_button.signal_clicked().connect (bind (mem_fun(*this, &GenericPluginUI::astate_clicked), control_ui, (uint32_t) port_index));
+               control_ui->automate_button.signal_clicked().connect (sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::astate_clicked), control_ui, (uint32_t) port_index));
 
                automation_state_changed (control_ui);
 
-               mcontrol->Changed.connect (bind (mem_fun (*this, &GenericPluginUI::parameter_changed), control_ui));
-               mcontrol->alist()->automation_state_changed.connect 
-                       (bind (mem_fun(*this, &GenericPluginUI::automation_state_changed), control_ui));
+               mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context());
+               mcontrol->alist()->automation_state_changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui), gui_context());
+
+               input_controls.push_back (control_ui);
 
        } else if (plugin->parameter_is_output (port_index)) {
 
@@ -551,7 +567,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
 
                MeterInfo * info = new MeterInfo(port_index);
                control_ui->meterinfo = info;
-               
+
                info->meter = new FastMeter (5, 5, FastMeter::Vertical);
 
                info->min_unbound = desc.min_unbound;
@@ -562,25 +578,25 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
 
                control_ui->vbox = manage (new VBox);
                control_ui->hbox = manage (new HBox);
-               
+
                control_ui->label.set_angle(90);
                control_ui->hbox->pack_start (control_ui->label, false, false);
                control_ui->hbox->pack_start (*info->meter, false, false);
 
                control_ui->vbox->pack_start (*control_ui->hbox, false, false);
-               
+
                control_ui->vbox->pack_start (*control_ui->display, false, false);
 
                control_ui->pack_start (*control_ui->vbox);
 
                control_ui->meterinfo->meter->show_all();
                control_ui->meterinfo->packed = true;
-               
+
                output_controls.push_back (control_ui);
        }
-       
-       mcontrol->Changed.connect (bind (mem_fun (*this, &GenericPluginUI::parameter_changed), control_ui));
-       
+
+       mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context());
+
        return control_ui;
 }
 
@@ -597,26 +613,26 @@ GenericPluginUI::stop_touch (GenericPluginUI::ControlUI* cui)
 }
 
 void
-GenericPluginUI::astate_clicked (ControlUI* cui, uint32_t port)
+GenericPluginUI::astate_clicked (ControlUI* cui, uint32_t /*port*/)
 {
        using namespace Menu_Helpers;
 
        if (automation_menu == 0) {
                automation_menu = manage (new Menu);
                automation_menu->set_name ("ArdourContextMenu");
-       } 
+       }
 
        MenuList& items (automation_menu->items());
 
        items.clear ();
-       items.push_back (MenuElem (_("Manual"), 
-                                  bind (mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Off, cui)));
+       items.push_back (MenuElem (_("Manual"),
+                                  sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Off, cui)));
        items.push_back (MenuElem (_("Play"),
-                                  bind (mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Play, cui)));
+                                  sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Play, cui)));
        items.push_back (MenuElem (_("Write"),
-                                  bind (mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Write, cui)));
+                                  sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Write, cui)));
        items.push_back (MenuElem (_("Touch"),
-                                  bind (mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Touch, cui)));
+                                  sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Touch, cui)));
 
        automation_menu->popup (1, gtk_get_current_event_time());
 }
@@ -627,25 +643,40 @@ GenericPluginUI::set_automation_state (AutoState state, ControlUI* cui)
        insert->set_parameter_automation_state (cui->parameter(), state);
 }
 
+void
+GenericPluginUI::toggle_parameter_changed (ControlUI* cui)
+{
+       float val = cui->control->get_value();
+
+       if (!cui->ignore_change) {
+               if (val > 0.5) {
+                       cui->button->set_active (true);
+               } else {
+                       cui->button->set_active (false);
+               }
+       }
+}
+
 void
 GenericPluginUI::parameter_changed (ControlUI* cui)
 {
        if (!cui->update_pending) {
                cui->update_pending = true;
-               Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun(*this, &GenericPluginUI::update_control_display), cui));
+               Gtkmm2ext::UI::instance()->call_slot (MISSING_INVALIDATOR, boost::bind (&GenericPluginUI::update_control_display, this, cui));
        }
 }
 
 void
-GenericPluginUI::update_control_display (ControlUI* cui)       
+GenericPluginUI::update_control_display (ControlUI* cui)
 {
        /* XXX how do we handle logarithmic stuff here ? */
-       
+
        cui->update_pending = false;
 
        float val = cui->control->get_value();
 
        cui->ignore_change++;
+
        if (cui->combo) {
                std::map<string,float>::iterator it;
                for (it = cui->combo_map->begin(); it != cui->combo_map->end(); ++it) {
@@ -682,9 +713,9 @@ GenericPluginUI::update_control_display (ControlUI* cui)
 void
 GenericPluginUI::control_port_toggled (ControlUI* cui)
 {
-       if (!cui->ignore_change) {
-               insert->set_parameter (cui->parameter(), cui->button->get_active());
-       }
+       cui->ignore_change++;
+       insert->automation_control (cui->parameter())->set_value (cui->button->get_active());
+       cui->ignore_change--;
 }
 
 void
@@ -693,38 +724,42 @@ GenericPluginUI::control_combo_changed (ControlUI* cui)
        if (!cui->ignore_change) {
                string value = cui->combo->get_active_text();
                std::map<string,float> mapping = *cui->combo_map;
-               insert->set_parameter (cui->parameter(), mapping[value]);
+               insert->automation_control(cui->parameter())->set_value(mapping[value]);
        }
-
 }
 
 void
 GenericPluginUI::processor_active_changed (boost::weak_ptr<Processor> weak_processor)
 {
-       ENSURE_GUI_THREAD(bind (mem_fun(*this, &GenericPluginUI::processor_active_changed), weak_processor));
-       
+       ENSURE_GUI_THREAD (*this, &GenericPluginUI::processor_active_changed, weak_processor)
+
        boost::shared_ptr<Processor> processor = weak_processor.lock();
 
        bypass_button.set_active (!processor || !processor->active());
 }
 
 bool
-GenericPluginUI::start_updating (GdkEventAny* ignored)
+GenericPluginUI::start_updating (GdkEventAny*)
 {
        if (output_controls.size() > 0 ) {
                screen_update_connection.disconnect();
-               screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect 
-                       (mem_fun(*this, &GenericPluginUI::output_update));
+               screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
+                       (sigc::mem_fun(*this, &GenericPluginUI::output_update));
        }
        return false;
 }
 
 bool
-GenericPluginUI::stop_updating (GdkEventAny* ignored)
+GenericPluginUI::stop_updating (GdkEventAny*)
 {
+       for (vector<ControlUI*>::iterator i = input_controls.begin(); i != input_controls.end(); ++i) {
+               (*i)->controller->stop_updating ();
+       }
+       
        if (output_controls.size() > 0 ) {
                screen_update_connection.disconnect();
        }
+       
        return false;
 }
 
@@ -739,7 +774,7 @@ GenericPluginUI::output_update ()
 
                /* autoscaling for the meter */
                if ((*i)->meterinfo && (*i)->meterinfo->packed) {
-                       
+
                        if (val < (*i)->meterinfo->min) {
                                if ((*i)->meterinfo->min_unbound)
                                        (*i)->meterinfo->min = val;
@@ -753,7 +788,7 @@ GenericPluginUI::output_update ()
                                else
                                        val = (*i)->meterinfo->max;
                        }
-                       
+
                        if ((*i)->meterinfo->max > (*i)->meterinfo->min ) {
                                float lval = (val - (*i)->meterinfo->min) / ((*i)->meterinfo->max - (*i)->meterinfo->min) ;
                                (*i)->meterinfo->meter->set (lval );
@@ -762,12 +797,12 @@ GenericPluginUI::output_update ()
        }
 }
 
-vector<string> 
+vector<string>
 GenericPluginUI::setup_scale_values(guint32 port_index, ControlUI* cui)
 {
        vector<string> enums;
        boost::shared_ptr<LadspaPlugin> lp;
-#ifdef HAVE_LV2
+#ifdef HAVE_SLV2
        boost::shared_ptr<LV2Plugin> lv2p;
 #endif
 
@@ -789,13 +824,13 @@ GenericPluginUI::setup_scale_values(guint32 port_index, ControlUI* cui)
                        lrdf_free_setting_values(defaults);
                }
 
-#ifdef HAVE_LV2
+#ifdef HAVE_SLV2
        } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin>(plugin)) != 0) {
 
                SLV2Port port = lv2p->slv2_port(port_index);
                SLV2ScalePoints points = slv2_port_get_scale_points(lv2p->slv2_plugin(), port);
                cui->combo_map = new std::map<string, float>;
-       
+
                for (unsigned i=0; i < slv2_scale_points_size(points); ++i) {
                        SLV2ScalePoint p = slv2_scale_points_get_at(points, i);
                        SLV2Value label = slv2_scale_point_get_label(p);
@@ -812,7 +847,10 @@ GenericPluginUI::setup_scale_values(guint32 port_index, ControlUI* cui)
                slv2_scale_points_free(points);
 #endif
        }
-       
+
 
        return enums;
 }
+
+
+