From 21dde8f2a716e79c0d6e5550eb9919992efc5173 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 2 Nov 2014 13:02:54 -0500 Subject: [PATCH] Fix crash when showing UI for plugins with output control ports. --- gtk2_ardour/generic_pluginui.cc | 34 ++++++++++++++++++++------------- gtk2_ardour/plugin_ui.h | 11 +++++++---- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index a4de4fd75e..a26ccfb694 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -249,23 +249,26 @@ GenericPluginUI::build () /* Don't show latency control ports */ - if (plugin->describe_parameter (Evoral::Parameter(PluginAutomation, 0, i)) == X_("latency")) { + const Evoral::Parameter param(PluginAutomation, 0, i); + if (plugin->describe_parameter (param) == X_("latency")) { continue; } - if (plugin->describe_parameter (Evoral::Parameter(PluginAutomation, 0, i)) == X_("hidden")) { + if (plugin->describe_parameter (param) == X_("hidden")) { continue; } + const float value = plugin->get_parameter(i); + ControlUI* cui; boost::shared_ptr c = boost::dynamic_pointer_cast( - insert->control(Evoral::Parameter(PluginAutomation, 0, i))); + insert->control(param)); ParameterDescriptor desc; plugin->get_parameter_descriptor(i, desc); - if ((cui = build_control_ui (desc, c, plugin->parameter_is_input(i))) == 0) { + if ((cui = build_control_ui (param, desc, c, value, plugin->parameter_is_input(i))) == 0) { error << string_compose(_("Plugin Editor: could not build control element for port %1"), i) << endmsg; continue; } @@ -283,17 +286,18 @@ GenericPluginUI::build () const Plugin::PropertyDescriptors& descs = plugin->get_supported_properties(); for (Plugin::PropertyDescriptors::const_iterator d = descs.begin(); d != descs.end(); ++d) { const ParameterDescriptor& desc = d->second; + const Evoral::Parameter param(PluginPropertyAutomation, 0, desc.key); boost::shared_ptr c = boost::dynamic_pointer_cast( - insert->control(Evoral::Parameter(PluginPropertyAutomation, 0, desc.key))); + insert->control(param)); if (!c) { error << string_compose(_("Plugin Editor: no control for property %1"), desc.key) << endmsg; continue; } - ControlUI* cui = build_control_ui(desc, c, true); + ControlUI* cui = build_control_ui(param, desc, c, c->get_value(), true); if (!cui) { error << string_compose(_("Plugin Editor: could not build control element for property %1"), desc.key) << endmsg; @@ -450,8 +454,9 @@ GenericPluginUI::build () button_table.show_all (); } -GenericPluginUI::ControlUI::ControlUI () - : automate_button (X_("")) // force creation of a label +GenericPluginUI::ControlUI::ControlUI (const Evoral::Parameter& p) + : param(p) + , automate_button (X_("")) // force creation of a label , file_button(NULL) { automate_button.set_name ("PluginAutomateButton"); @@ -531,16 +536,19 @@ GenericPluginUI::print_parameter (char *buf, uint32_t len, uint32_t param) plugin->print_parameter (param, buf, len); } +/** Build a ControlUI for a parameter/property. + * Note that mcontrol may be NULL for outputs. + */ GenericPluginUI::ControlUI* -GenericPluginUI::build_control_ui (const ParameterDescriptor& desc, +GenericPluginUI::build_control_ui (const Evoral::Parameter& param, + const ParameterDescriptor& desc, boost::shared_ptr mcontrol, + float value, bool is_input) { ControlUI* control_ui = 0; - const float value = mcontrol->get_value(); - - control_ui = manage (new ControlUI ()); + control_ui = manage (new ControlUI (param)); control_ui->combo = 0; control_ui->control = mcontrol; control_ui->update_pending = false; @@ -932,7 +940,7 @@ void GenericPluginUI::output_update () { for (vector::iterator i = output_controls.begin(); i != output_controls.end(); ++i) { - float val = (*i)->control->get_value(); + float val = plugin->get_parameter ((*i)->parameter().id()); char buf[32]; snprintf (buf, sizeof(buf), "%.2f", val); (*i)->display_label->set_text (buf); diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h index 9f4e2effcf..e02d8eab57 100644 --- a/gtk2_ardour/plugin_ui.h +++ b/gtk2_ardour/plugin_ui.h @@ -226,9 +226,10 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox /* FIXME: Unify with AutomationController */ struct ControlUI : public Gtk::HBox { - boost::shared_ptr control; + const Evoral::Parameter parameter() const { return param; } - Evoral::Parameter parameter() { return control->parameter(); } + Evoral::Parameter param; + boost::shared_ptr control; /* input */ @@ -252,7 +253,7 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox Gtk::VBox* vbox; MeterInfo* meterinfo; - ControlUI (); + ControlUI (const Evoral::Parameter& param); ~ControlUI (); }; @@ -262,8 +263,10 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox void output_update(); void build (); - ControlUI* build_control_ui (const ARDOUR::ParameterDescriptor& desc, + ControlUI* build_control_ui (const Evoral::Parameter& param, + const ARDOUR::ParameterDescriptor& desc, boost::shared_ptr mcontrol, + float value, bool is_input); void ui_parameter_changed (ControlUI* cui); -- 2.30.2