[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, ¶ms[param_no]);
+ write_function(controller, param_no + get_param_port_offset(), sizeof(float), 0, ¶ms[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