From c3bfc3ec4e14d147d9c4c279eb6c73947781f956 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 3 Feb 2010 00:52:45 +0000 Subject: Stop crash on deleting a plugin when its generic UI window is open. git-svn-id: svn://localhost/ardour2/branches/3.0@6626 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/automation_controller.cc | 6 ++++++ gtk2_ardour/automation_controller.h | 4 +++- gtk2_ardour/generic_pluginui.cc | 12 ++++++++++-- gtk2_ardour/plugin_ui.cc | 2 +- gtk2_ardour/plugin_ui.h | 1 + libs/ardour/plugin_insert.cc | 9 +++++---- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc index 1a32c36b62..0d16628ab0 100644 --- a/gtk2_ardour/automation_controller.cc +++ b/gtk2_ardour/automation_controller.cc @@ -150,3 +150,9 @@ AutomationController::value_changed () Gtkmm2ext::UI::instance()->call_slot (boost::bind (&AutomationController::display_effective_value, this)); } +/** Stop updating our value from our controllable */ +void +AutomationController::stop_updating () +{ + _screen_update_connection.disconnect (); +} diff --git a/gtk2_ardour/automation_controller.h b/gtk2_ardour/automation_controller.h index e6d377ab26..a2168700e2 100644 --- a/gtk2_ardour/automation_controller.h +++ b/gtk2_ardour/automation_controller.h @@ -34,7 +34,7 @@ namespace ARDOUR { class Automatable; } - +/** A BarController which displays the value and allows control of an AutomationControl */ class AutomationController : public Gtkmm2ext::BarController { public: static boost::shared_ptr create( @@ -51,6 +51,8 @@ public: void display_effective_value(); void value_adjusted(); + void stop_updating (); + private: AutomationController (boost::shared_ptr ac, Gtk::Adjustment* adj); std::string get_label (int&); diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index 3d59910ff4..974d16887c 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -381,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 mcontrol) { - ControlUI* control_ui = NULL; - if (!mcontrol) + ControlUI* control_ui = 0; + if (!mcontrol) { return control_ui; + } Plugin::ParameterDescriptor desc; @@ -545,6 +546,8 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptrChanged.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context()); mcontrol->alist()->automation_state_changed.connect (control_connections, 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)) { control_ui->display = manage (new EventBox); @@ -749,9 +752,14 @@ GenericPluginUI::start_updating (GdkEventAny*) bool GenericPluginUI::stop_updating (GdkEventAny*) { + for (vector::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; } diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index 1273682083..1c7ce5d9e6 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -120,7 +120,7 @@ PluginUIWindow::PluginUIWindow (Gtk::Window* win, boost::shared_ptr input_controls; std::vector output_controls; sigc::connection screen_update_connection; void output_update(); diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 518473a8c9..9858362566 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -432,11 +432,12 @@ PluginInsert::set_parameter (Evoral::Parameter param, float val) float PluginInsert::get_parameter (Evoral::Parameter param) { - if (param.type() != PluginAutomation) + if (param.type() != PluginAutomation) { return 0.0; - else - return - _plugins[0]->get_parameter (param.id()); + } else { + assert (!_plugins.empty ()); + return _plugins[0]->get_parameter (param.id()); + } } void -- cgit v1.2.3