diff options
author | Carl Hetherington <carl@carlh.net> | 2010-12-19 23:11:01 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2010-12-19 23:11:01 +0000 |
commit | 5f4bdb233a53932986e07fca1cd6c87d22c2886f (patch) | |
tree | c9c980115453452dc21931d4337ab1b592f80d95 /gtk2_ardour | |
parent | bb7dbe6d86e08ea0fedf12ce50ca3d395aa212a5 (diff) |
Clean up plugin preset handling a bit.
git-svn-id: svn://localhost/ardour2/branches/3.0@8301 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/generic_pluginui.cc | 12 | ||||
-rw-r--r-- | gtk2_ardour/lv2_plugin_ui.cc | 5 | ||||
-rw-r--r-- | gtk2_ardour/lv2_plugin_ui.h | 6 | ||||
-rw-r--r-- | gtk2_ardour/plugin_ui.cc | 115 | ||||
-rw-r--r-- | gtk2_ardour/plugin_ui.h | 19 | ||||
-rw-r--r-- | gtk2_ardour/vst_pluginui.cc | 20 | ||||
-rw-r--r-- | gtk2_ardour/vst_pluginui.h | 2 |
7 files changed, 100 insertions, 79 deletions
diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index f672af112e..9204912a36 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -92,7 +92,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol set_latency_label (); smaller_hbox->pack_start (latency_button, false, false, 10); - smaller_hbox->pack_start (preset_combo, false, false); + smaller_hbox->pack_start (_preset_box, false, false); smaller_hbox->pack_start (add_button, false, false); smaller_hbox->pack_start (save_button, false, false); smaller_hbox->pack_start (delete_button, false, false); @@ -425,7 +425,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat //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 (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()); + mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::ui_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); @@ -446,7 +446,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat //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 (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()); + mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::ui_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); @@ -557,7 +557,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat automation_state_changed (control_ui); - mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context()); + mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::ui_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); @@ -609,7 +609,7 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat output_controls.push_back (control_ui); } - mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context()); + mcontrol->Changed.connect (control_connections, invalidator (*this), boost::bind (&GenericPluginUI::ui_parameter_changed, this, control_ui), gui_context()); return control_ui; } @@ -672,7 +672,7 @@ GenericPluginUI::toggle_parameter_changed (ControlUI* cui) } void -GenericPluginUI::parameter_changed (ControlUI* cui) +GenericPluginUI::ui_parameter_changed (ControlUI* cui) { if (!cui->update_pending) { cui->update_pending = true; diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc index 89d46846eb..f8924e5bec 100644 --- a/gtk2_ardour/lv2_plugin_ui.cc +++ b/gtk2_ardour/lv2_plugin_ui.cc @@ -55,7 +55,8 @@ void LV2PluginUI::on_external_ui_closed(LV2UI_Controller controller) void LV2PluginUI::parameter_changed (uint32_t port_index, float val) { - //cout << "parameter_changed" << endl; + PlugUIBase::parameter_changed (port_index, val); + if (val != _values[port_index]) { parameter_update(port_index, val); } @@ -199,8 +200,6 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title) } } } - - _lv2->ParameterChanged.connect (parameter_connection, invalidator (*this), ui_bind (&LV2PluginUI::parameter_changed, this, _1, _2), gui_context()); } LV2PluginUI::~LV2PluginUI () diff --git a/gtk2_ardour/lv2_plugin_ui.h b/gtk2_ardour/lv2_plugin_ui.h index 817e1e825d..37234c59eb 100644 --- a/gtk2_ardour/lv2_plugin_ui.h +++ b/gtk2_ardour/lv2_plugin_ui.h @@ -59,6 +59,9 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox int package (Gtk::Window&); private: + + void parameter_changed (uint32_t, float); + boost::shared_ptr<ARDOUR::LV2Plugin> _lv2; std::vector<int> _output_ports; sigc::connection _screen_update_connection; @@ -83,7 +86,6 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox void lv2ui_instantiate(const std::string& title); - void parameter_changed(uint32_t, float); void parameter_update(uint32_t, float); bool configure_handler (GdkEventConfigure*); void save_plugin_setting (); @@ -92,8 +94,6 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox virtual bool on_window_show(const std::string& title); virtual void on_window_hide(); - - PBD::ScopedConnection parameter_connection; }; #endif // HAVE_SLV2 diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index d18f81b2c4..9ad9e38f8e 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -217,7 +217,8 @@ PluginUIWindow::on_show () set_role("plugin_ui"); if (_pluginui) { - _pluginui->update_presets (); + _pluginui->update_preset_list (); + _pluginui->update_preset (); } if (_pluginui) { @@ -427,15 +428,17 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi) latency_gui (0), plugin_analysis_expander (_("Plugin analysis")) { - //preset_combo.set_use_arrows_always(true); - update_presets (); - update_sensitivity (); - - preset_combo.set_size_request (100, -1); - preset_combo.set_active_text (""); - preset_combo.signal_changed().connect(sigc::mem_fun(*this, &PlugUIBase::setting_selected)); - no_load_preset = false; + _preset_combo.set_size_request (100, -1); + _preset_modified.set_size_request (16, -1); + _preset_combo.signal_changed().connect(sigc::mem_fun(*this, &PlugUIBase::preset_selected)); + _no_load_preset = 0; + + _preset_box.pack_start (_preset_combo); + _preset_box.pack_start (_preset_modified); + update_preset_list (); + update_preset (); + add_button.set_name ("PluginAddButton"); add_button.signal_clicked().connect (sigc::mem_fun (*this, &PlugUIBase::add_plugin_setting)); @@ -471,8 +474,10 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi) insert->DropReferences.connect (death_connection, invalidator (*this), boost::bind (&PlugUIBase::plugin_going_away, this), gui_context()); - plugin->PresetAdded.connect (preset_added_connection, invalidator (*this), boost::bind (&PlugUIBase::update_presets, this), gui_context ()); - plugin->PresetRemoved.connect (preset_removed_connection, invalidator (*this), boost::bind (&PlugUIBase::update_presets, this), gui_context ()); + plugin->PresetAdded.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::preset_added_or_removed, this), gui_context ()); + plugin->PresetRemoved.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::preset_added_or_removed, this), gui_context ()); + plugin->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::update_preset, this), gui_context ()); + plugin->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::parameter_changed, this, _1, _2), gui_context ()); } PlugUIBase::~PlugUIBase() @@ -529,20 +534,19 @@ PlugUIBase::processor_active_changed (boost::weak_ptr<Processor> weak_p) } void -PlugUIBase::setting_selected () +PlugUIBase::preset_selected () { - if (no_load_preset) { + if (_no_load_preset) { return; } - if (preset_combo.get_active_text().length() > 0) { - const Plugin::PresetRecord* pr = plugin->preset_by_label(preset_combo.get_active_text()); + if (_preset_combo.get_active_text().length() > 0) { + const Plugin::PresetRecord* pr = plugin->preset_by_label (_preset_combo.get_active_text()); if (pr) { - plugin->load_preset (pr->uri); - update_sensitivity (); + plugin->load_preset (*pr); } else { warning << string_compose(_("Plugin preset %1 not found"), - preset_combo.get_active_text()) << endmsg; + _preset_combo.get_active_text()) << endmsg; } } } @@ -562,8 +566,9 @@ PlugUIBase::add_plugin_setting () plugin->remove_preset (d.name ()); } - if (plugin->save_preset (d.name())) { - preset_combo.set_active_text (d.name()); + Plugin::PresetRecord const r = plugin->save_preset (d.name()); + if (!r.uri.empty ()) { + plugin->load_preset (r); } break; } @@ -572,23 +577,18 @@ PlugUIBase::add_plugin_setting () void PlugUIBase::save_plugin_setting () { - string const name = preset_combo.get_active_text (); + string const name = _preset_combo.get_active_text (); plugin->remove_preset (name); - plugin->save_preset (name); - preset_combo.set_active_text (name); + Plugin::PresetRecord const r = plugin->save_preset (name); + if (!r.uri.empty ()) { + plugin->load_preset (r); + } } void PlugUIBase::delete_plugin_setting () { - plugin->remove_preset (preset_combo.get_active_text ()); - - vector<ARDOUR::Plugin::PresetRecord> presets = plugin->get_presets(); - if (presets.empty ()) { - preset_combo.set_active_text (""); - } else { - preset_combo.set_active_text (presets.front().label); - } + plugin->remove_preset (_preset_combo.get_active_text ()); } void @@ -667,30 +667,61 @@ PlugUIBase::toggle_plugin_analysis() } void -PlugUIBase::update_presets () +PlugUIBase::update_preset_list () { vector<string> preset_labels; vector<ARDOUR::Plugin::PresetRecord> presets = plugin->get_presets(); - no_load_preset = true; + ++_no_load_preset; for (vector<ARDOUR::Plugin::PresetRecord>::const_iterator i = presets.begin(); i != presets.end(); ++i) { - preset_labels.push_back(i->label); + preset_labels.push_back (i->label); } - set_popdown_strings (preset_combo, preset_labels); + set_popdown_strings (_preset_combo, preset_labels); - no_load_preset = false; + --_no_load_preset; +} + +void +PlugUIBase::update_preset () +{ + Plugin::PresetRecord p = plugin->last_preset(); + + ++_no_load_preset; + _preset_combo.set_active_text (p.label); + --_no_load_preset; - update_sensitivity (); + save_button.set_sensitive (!p.uri.empty() && p.user); + delete_button.set_sensitive (!p.uri.empty() && p.user); + + update_preset_modified (); } void -PlugUIBase::update_sensitivity () +PlugUIBase::update_preset_modified () { - bool const have_user_preset = - !preset_combo.get_model()->children().empty() && preset_combo.get_active_row_number() >= plugin->first_user_preset_index(); + if (plugin->last_preset().uri.empty()) { + _preset_modified.set_text (""); + return; + } - save_button.set_sensitive (have_user_preset); - delete_button.set_sensitive (have_user_preset); + bool const c = plugin->parameter_changed_since_last_preset (); + if (_preset_modified.get_text().empty() == c) { + _preset_modified.set_text (c ? "*" : ""); + } +} + +void +PlugUIBase::parameter_changed (uint32_t, float) +{ + update_preset_modified (); +} + +void +PlugUIBase::preset_added_or_removed () +{ + /* Update both the list and the currently-displayed preset */ + update_preset_list (); + update_preset (); } diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h index 99a4ce36e8..16ecc4bd15 100644 --- a/gtk2_ardour/plugin_ui.h +++ b/gtk2_ardour/plugin_ui.h @@ -72,7 +72,7 @@ namespace Gtkmm2ext { class LatencyGUI; class ArdourDialog; -class PlugUIBase : public virtual sigc::trackable +class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionList { public: PlugUIBase (boost::shared_ptr<ARDOUR::PluginInsert>); @@ -86,7 +86,8 @@ class PlugUIBase : public virtual sigc::trackable virtual void activate () {} virtual void deactivate () {} - virtual void update_presets (); + void update_preset_list (); + void update_preset (); void latency_button_clicked (); @@ -101,7 +102,9 @@ class PlugUIBase : public virtual sigc::trackable protected: boost::shared_ptr<ARDOUR::PluginInsert> insert; boost::shared_ptr<ARDOUR::Plugin> plugin; - Gtk::ComboBoxText preset_combo; + Gtk::HBox _preset_box; + Gtk::ComboBoxText _preset_combo; + Gtk::Label _preset_modified; Gtk::Button add_button; Gtk::Button save_button; Gtk::Button delete_button; @@ -119,9 +122,9 @@ class PlugUIBase : public virtual sigc::trackable Gtk::Image* focus_out_image; Gtk::Image* focus_in_image; - bool no_load_preset; + int _no_load_preset; - virtual void setting_selected (); + virtual void preset_selected (); void add_plugin_setting (); void save_plugin_setting (); void delete_plugin_setting (); @@ -130,7 +133,9 @@ class PlugUIBase : public virtual sigc::trackable void toggle_plugin_analysis (); void processor_active_changed (boost::weak_ptr<ARDOUR::Processor> p); void plugin_going_away (); - void update_sensitivity (); + virtual void parameter_changed (uint32_t, float); + void preset_added_or_removed (); + void update_preset_modified (); PBD::ScopedConnection death_connection; PBD::ScopedConnection active_connection; @@ -234,7 +239,7 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox void build (); ControlUI* build_control_ui (guint32 port_index, boost::shared_ptr<ARDOUR::AutomationControl>); std::vector<std::string> setup_scale_values(guint32 port_index, ControlUI* cui); - void parameter_changed (ControlUI* cui); + void ui_parameter_changed (ControlUI* cui); void toggle_parameter_changed (ControlUI* cui); void update_control_display (ControlUI* cui); void control_port_toggled (ControlUI* cui); diff --git a/gtk2_ardour/vst_pluginui.cc b/gtk2_ardour/vst_pluginui.cc index be8a619e70..b6902445f3 100644 --- a/gtk2_ardour/vst_pluginui.cc +++ b/gtk2_ardour/vst_pluginui.cc @@ -35,8 +35,6 @@ VSTPluginUI::VSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr< : PlugUIBase (pi), vst (vp) { - update_presets (); - fst_run_editor (vst->fst()); preset_box.set_spacing (6); @@ -45,7 +43,7 @@ VSTPluginUI::VSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr< preset_box.pack_end (delete_button, false, false); preset_box.pack_end (save_button, false, false); preset_box.pack_end (add_button, false, false); - preset_box.pack_end (preset_combo, false, false); + preset_box.pack_end (_preset_box, false, false); bypass_button.set_active (!insert->active()); @@ -61,22 +59,10 @@ VSTPluginUI::~VSTPluginUI () } void -VSTPluginUI::setting_selected () +VSTPluginUI::preset_selected () { - int const r = preset_combo.get_active_row_number (); - - if (r < vst->first_user_preset_index()) { - /* This is a plugin-provided preset. - We can't dispatch directly here; too many plugins expects only one GUI thread. - */ - vst->fst()->want_program = r; - } else { - /* This is a user preset. This method knows about the direct dispatch restriction, too */ - plugin->load_preset (preset_combo.get_active_text()); - } - socket.grab_focus (); - update_sensitivity (); + PlugUIBase::preset_selected (); } int diff --git a/gtk2_ardour/vst_pluginui.h b/gtk2_ardour/vst_pluginui.h index 71452617f8..c8666a4da9 100644 --- a/gtk2_ardour/vst_pluginui.h +++ b/gtk2_ardour/vst_pluginui.h @@ -40,5 +40,5 @@ class VSTPluginUI : public PlugUIBase, public Gtk::VBox bool configure_handler (GdkEventConfigure*, Gtk::Socket*); void save_plugin_setting (); - void setting_selected (); + void preset_selected (); }; |