From b8cea19b957b3af6ce0dd72f6441cb333e38ab94 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 31 Oct 2014 03:26:47 +0100 Subject: prototype [LV2]patch-change support for generic plugin UIs. --- gtk2_ardour/generic_pluginui.cc | 47 +++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/plugin_ui.h | 6 ++++++ 2 files changed, 53 insertions(+) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index 21a21b1751..e1d4609f6a 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -41,6 +41,9 @@ #include "ardour/plugin.h" #include "ardour/plugin_insert.h" #include "ardour/session.h" +#ifdef LV2_SUPPORT +#include "ardour/lv2_plugin.h" +#endif #include "ardour_ui.h" #include "prompter.h" @@ -305,6 +308,34 @@ GenericPluginUI::build () } } +#ifdef LV2_SUPPORT + boost::shared_ptr lv2p = boost::dynamic_pointer_cast (plugin); + if (lv2p) { + _fcb = (Gtk::FileChooserButton**) malloc(lv2p->patch_count() * sizeof(Gtk::FileChooserButton*)); + for (uint32_t p = 0; p < lv2p->patch_count(); ++p) { + _fcb[p] = manage (new Gtk::FileChooserButton (Gtk::FILE_CHOOSER_ACTION_OPEN)); + _fcb[p]->signal_file_set().connect (sigc::bind(sigc::mem_fun (*this, &GenericPluginUI::patch_set_file), p)); + lv2p->PatchChanged.connect (*this, invalidator (*this), boost::bind (&GenericPluginUI::patch_changed, this, _1), gui_context()); + // when user cancels file selection the FileChooserButton will display "None" + // TODO hack away around this.. + if (lv2p->patch_val(p)) { + _fcb[p]->set_filename(lv2p->patch_val(p)); + } + if (lv2p->patch_key(p)) { + _fcb[p]->set_title(lv2p->patch_key(p)); + Gtk::Label* fcl = manage (new Label (lv2p->patch_key(p))); + button_table.attach (*fcl, 0, button_cols, button_row, button_row + 1, FILL|EXPAND, FILL); + ++button_row; + } else { + _fcb[p]->set_title(_("LV2 Patch")); + } + + button_table.attach (*_fcb[p], 0, button_cols, button_row, button_row + 1, FILL|EXPAND, FILL); + ++button_row; + } + } +#endif + // Iterate over the list of controls to find which adjacent controls // are similar enough to be grouped together. @@ -934,4 +965,20 @@ GenericPluginUI::output_update () } } +#ifdef LV2_SUPPORT +void +GenericPluginUI::patch_set_file (uint32_t p) +{ + boost::shared_ptr lv2p = boost::dynamic_pointer_cast (plugin); + lv2p->patch_set(p, _fcb[p]->get_filename ().c_str()); +} + +void +GenericPluginUI::patch_changed (uint32_t p) +{ + boost::shared_ptr lv2p = boost::dynamic_pointer_cast (plugin); + _fcb[p]->set_filename(lv2p->patch_val(p)); +} + +#endif diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h index fefa999618..e5a5b59930 100644 --- a/gtk2_ardour/plugin_ui.h +++ b/gtk2_ardour/plugin_ui.h @@ -278,6 +278,12 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox void print_parameter (char *buf, uint32_t len, uint32_t param); bool integer_printer (char* buf, Gtk::Adjustment &, ControlUI *); bool midinote_printer(char* buf, Gtk::Adjustment &, ControlUI *); + +#ifdef LV2_SUPPORT + void patch_set_file (uint32_t patch_idx); + void patch_changed (uint32_t patch_idx); + Gtk::FileChooserButton **_fcb; +#endif }; class PluginUIWindow : public ArdourWindow -- cgit v1.2.3