[SCM] calf/master: + Framework: changed LV2 GUI implementation to rely on plugin_metadata_iface only, not on concrete plugin classes.

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:38:20 UTC 2013


The following commit has been merged in the master branch:
commit b55dfaf48d03720f2dba17e9745260888d4b1afc
Author: Krzysztof Foltman <wdev at foltman.com>
Date:   Wed Nov 5 00:12:45 2008 +0000

    + Framework: changed LV2 GUI implementation to rely on plugin_metadata_iface only, not on concrete plugin classes.

diff --git a/src/Makefile.am b/src/Makefile.am
index 5a7051b..ac817db 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -58,7 +58,7 @@ calf_la_LDFLAGS = -rpath $(ladspadir) -avoid-version -module -lexpat -export-sym
 endif
 
 if USE_LV2_GUI
-calflv2gui_la_SOURCES = gui.cpp ctl_curve.cpp ctl_keyboard.cpp ctl_led.cpp custom_ctl.cpp modules.cpp giface.cpp monosynth.cpp organ.cpp preset.cpp synth.cpp lv2gui.cpp main_win.cpp
+calflv2gui_la_SOURCES = gui.cpp ctl_curve.cpp ctl_keyboard.cpp ctl_led.cpp custom_ctl.cpp modules.cpp giface.cpp monosynth.cpp organ.cpp preset.cpp synth.cpp lv2gui.cpp main_win.cpp utils.cpp
 if USE_DEBUG
 calflv2gui_la_LDFLAGS = -rpath $(lv2dir) -avoid-version -module -lexpat $(GUI_DEPS_LIBS) 
 else
@@ -70,7 +70,7 @@ libcalfstatic_la_SOURCES = modules.cpp modules_small.cpp giface.cpp monosynth.cp
 libcalfstatic_la_LDFLAGS = -static -lexpat
 
 if USE_GUI
-libcalfgui_la_SOURCES = gui.cpp ctl_curve.cpp ctl_keyboard.cpp ctl_led.cpp preset_gui.cpp custom_ctl.cpp osctl.cpp osctlnet.cpp main_win.cpp
+libcalfgui_la_SOURCES = gui.cpp ctl_curve.cpp ctl_keyboard.cpp ctl_led.cpp preset_gui.cpp custom_ctl.cpp osctl.cpp osctlnet.cpp main_win.cpp utils.cpp
 libcalfgui_la_LDFLAGS = -static
 endif
 
diff --git a/src/calf/giface.h b/src/calf/giface.h
index ad181bf..07b9704 100644
--- a/src/calf/giface.h
+++ b/src/calf/giface.h
@@ -338,6 +338,38 @@ public:
     virtual const ladspa_plugin_info &get_plugin_info() { return plugin_info; }
 };
 
+/// A class for delegating metadata implementation to "remote" metadata class.
+/// Used for GUI wrappers that cannot have a dependency on actual classes,
+/// and which instead take an "external" metadata object pointer, obtained
+/// through get_all_plugins.
+class plugin_metadata_proxy: public virtual plugin_metadata_iface
+{
+public:
+    plugin_metadata_iface *impl;
+public:
+    plugin_metadata_proxy(plugin_metadata_iface *_impl) { impl = _impl; }
+    const char *get_name() { return impl->get_name(); } 
+    const char *get_id() { return impl->get_id(); } 
+    const char *get_label() { return impl->get_label(); } 
+    int get_input_count() { return impl->get_input_count(); }
+    int get_output_count() { return impl->get_output_count(); }
+    int get_param_count() { return impl->get_param_count(); }
+    bool get_midi() { return impl->get_midi(); }
+    bool requires_midi() { return impl->requires_midi(); }
+    bool is_rt_capable() { return impl->is_rt_capable(); }
+    line_graph_iface *get_line_graph_iface() { return impl->get_line_graph_iface(); }    
+    int get_param_port_offset()  { return impl->get_param_port_offset(); }
+    const char *get_gui_xml() { return impl->get_gui_xml(); }
+    plugin_command_info *get_commands() { return impl->get_commands(); }
+    parameter_properties *get_param_props(int param_no) { return impl->get_param_props(param_no); }
+    const char **get_port_names() { return impl->get_port_names(); }
+    const char **get_default_configure_vars() { return impl->get_default_configure_vars(); }
+    bool is_cv(int param_no) { return impl->is_cv(param_no); }
+    bool is_noisy(int param_no) { return impl->is_noisy(param_no); }
+    virtual const ladspa_plugin_info &get_plugin_info() { return impl->get_plugin_info(); }
+    
+};
+
 #define CALF_PORT_NAMES(name) template<> const char *synth::plugin_metadata<name##_metadata>::port_names[]
 #define CALF_PORT_PROPS(name) template<> parameter_properties plugin_metadata<name##_metadata>::param_props[]
 #define CALF_PLUGIN_INFO(name) template<> synth::ladspa_plugin_info plugin_metadata<name##_metadata>::plugin_info
diff --git a/src/dssigui.cpp b/src/dssigui.cpp
index 630279c..a71e9d3 100644
--- a/src/dssigui.cpp
+++ b/src/dssigui.cpp
@@ -148,14 +148,6 @@ struct plugin_proxy: public plugin_proxy_base, public Metadata
         for (map<string, string>::iterator i = cfg_vars.begin(); i != cfg_vars.end(); i++)
             sci->send_configure(i->first.c_str(), i->second.c_str());
     }
-    void clear_preset() {
-        const char **p = get_default_configure_vars();
-        if (p)
-        {
-            for(; p[0]; p += 2)
-                configure(p[0], p[1]);
-        }
-    }
 };
 
 plugin_proxy_base *create_plugin_proxy(const char *effect_name)
diff --git a/src/lv2gui.cpp b/src/lv2gui.cpp
index 6679a99..6f9531f 100644
--- a/src/lv2gui.cpp
+++ b/src/lv2gui.cpp
@@ -17,6 +17,7 @@
  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+#include <assert.h>
 #include <getopt.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -24,9 +25,6 @@
 #include <calf/giface.h>
 #include <calf/gui.h>
 #include <calf/main_win.h>
-#include <calf/modules.h>
-#include <calf/modules_dev.h>
-#include <calf/benchmark.h>
 #include <calf/lv2_ui.h>
 #include <calf/preset_gui.h>
 #include <calf/utils.h>
@@ -37,18 +35,25 @@ using namespace dsp;
 using namespace synth;
 using namespace calf_utils;
 
-struct plugin_proxy_base: public plugin_ctl_iface
+struct plugin_proxy: public plugin_ctl_iface, public plugin_metadata_proxy
 {
     LV2UI_Write_Function write_function;
     LV2UI_Controller controller;
     
     bool send;
     plugin_gui *gui;
+    float *params;
+    int param_count;
     
-    plugin_proxy_base()
+    plugin_proxy(plugin_metadata_iface *md)
+    : plugin_metadata_proxy(md)
     {
-        send = false;
         gui = NULL;
+        send = true;
+        param_count = get_param_count();
+        params = new float[param_count];
+        for (int i = 0; i < param_count; i++)
+            params[i] = get_param_props(i)->def_value;
     }
     
     void setup(LV2UI_Write_Function wfn, LV2UI_Controller ctl)
@@ -57,33 +62,19 @@ struct plugin_proxy_base: public plugin_ctl_iface
         controller = ctl;
     }
     
-};
-
-template<class Metadata>
-struct plugin_proxy: public plugin_proxy_base, public Metadata
-{
-    using Metadata::param_count;
-    
-    float params[param_count];
-    plugin_proxy()
-    {
-        send = true;
-        for (int i = 0; i < param_count; i++)
-            params[i] = Metadata::param_props[i].def_value;
-    }
-    
     virtual float get_param_value(int param_no) {
-        if (param_no < 0 || param_no >= Metadata::param_count)
+        if (param_no < 0 || param_no >= param_count)
             return 0;
         return params[param_no];
     }
+    
     virtual void set_param_value(int param_no, float value) {
-        if (param_no < 0 || param_no >= Metadata::param_count)
+        if (param_no < 0 || param_no >= param_count)
             return;
         params[param_no] = value;
         if (send) {
             scope_assign<bool> _a_(send, false);
-            write_function(controller, param_no + Metadata::in_count + Metadata::out_count, sizeof(float), 0, &params[param_no]);
+            write_function(controller, param_no + get_param_port_offset(), sizeof(float), 0, &params[param_no]);
         }
     }
     
@@ -91,6 +82,7 @@ struct plugin_proxy: public plugin_proxy_base, public Metadata
     {
         return false;
     }
+    
     virtual float get_level(unsigned int port) { return 0.f; }
     virtual void execute(int command_no) { assert(0); }
     void send_configures(send_configure_iface *sci) { 
@@ -99,15 +91,12 @@ struct plugin_proxy: public plugin_proxy_base, public Metadata
     void clear_preset() {
         fprintf(stderr, "TODO: clear_preset (reset to init state) not implemented in LV2 GUIs\n");
     }
+    ~plugin_proxy()
+    {
+        delete []params;
+    }
 };
 
-plugin_proxy_base *create_plugin_proxy(const char *effect_name)
-{
-    #define PER_MODULE_ITEM(name, isSynth, jackname) if (!strcmp(effect_name, name##_metadata::plugin_info.label)) return new plugin_proxy<name##_metadata>();
-    #include <calf/modulelist.h>
-    return NULL;
-}
-
 LV2UI_Handle gui_instantiate(const struct _LV2UI_Descriptor* descriptor,
                           const char*                     plugin_uri,
                           const char*                     bundle_path,
@@ -116,7 +105,18 @@ LV2UI_Handle gui_instantiate(const struct _LV2UI_Descriptor* descriptor,
                           LV2UI_Widget*                   widget,
                           const LV2_Feature* const*       features)
 {
-    plugin_proxy_base *proxy = create_plugin_proxy(plugin_uri + sizeof("http://calf.sourceforge.net/plugins/") - 1);
+    vector<plugin_metadata_iface *> plugins;
+    get_all_plugins(plugins);
+    const char *label = plugin_uri + sizeof("http://calf.sourceforge.net/plugins/") - 1;
+    plugin_proxy *proxy = NULL;
+    for (unsigned int i = 0; i < plugins.size(); i++)
+    {
+        if (!strcmp(plugins[i]->get_plugin_info().label, label))
+        {
+            proxy = new plugin_proxy(plugins[i]);
+            break;
+        }
+    }
     if (!proxy)
         return NULL;
     scope_assign<bool> _a_(proxy->send, false);
@@ -150,7 +150,7 @@ void gui_port_event(LV2UI_Handle handle, uint32_t port, uint32_t buffer_size, ui
         return;
     if (fabs(gui->plugin->get_param_value(port) - v) < 0.00001)
         return;
-    plugin_proxy_base *proxy = dynamic_cast<plugin_proxy_base *>(gui->plugin);
+    plugin_proxy *proxy = dynamic_cast<plugin_proxy *>(gui->plugin);
     assert(proxy);
     {
         scope_assign<bool> _a_(proxy->send, false);

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list