[SCM] calf/master: + LV2: update contexts extension, store port types in a wrapper class (to be used in polyphonic ports implementation)
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:38:45 UTC 2013
The following commit has been merged in the master branch:
commit b7dac5ea8c40db5f4fbf1fa9e37ca82d2f02bb2d
Author: Krzysztof Foltman <wdev at foltman.com>
Date: Wed Dec 31 00:29:28 2008 +0000
+ LV2: update contexts extension, store port types in a wrapper class (to be used in polyphonic ports implementation)
diff --git a/src/calf/giface.h b/src/calf/giface.h
index 3b53324..1a085fb 100644
--- a/src/calf/giface.h
+++ b/src/calf/giface.h
@@ -329,7 +329,7 @@ public:
inline void params_reset() {}
/// Handle 'message context' port message
/// @arg output_ports pointer to bit array of output port "changed" flags, note that 0 = first audio input, not first parameter (use input_count + output_count)
- inline uint32_t message_run(uint32_t *valid_ports, uint32_t *output_ports) {
+ inline uint32_t message_run(const void *valid_ports, void *output_ports) {
fprintf(stderr, "ERROR: message run not implemented\n");
return 0;
}
diff --git a/src/calf/lv2_contexts.h b/src/calf/lv2_contexts.h
index 1d43707..59ac603 100644
--- a/src/calf/lv2_contexts.h
+++ b/src/calf/lv2_contexts.h
@@ -26,18 +26,18 @@
#define LV2_CONTEXT_MESSAGE "http://lv2plug.in/ns/dev/contexts#MessageContext"
static inline void
-lv2_contexts_set_port_valid(uint32_t* flags, uint32_t index) {
- ((uint8_t*)flags)[(index) / 8] |= 1 << ((index) % 8);
+lv2_contexts_set_port_valid(void* flags, uint32_t index) {
+ ((uint8_t*)flags)[index / 8] |= 1 << (index % 8);
}
static inline void
-lv2_contexts_unset_port_valid(uint32_t* flags, uint32_t index) {
- ((uint8_t*)flags)[(index) / 8] &= ~(1 << ((index) % 8));
+lv2_contexts_unset_port_valid(void* flags, uint32_t index) {
+ ((uint8_t*)flags)[index / 8] &= ~(1 << (index % 8));
}
static inline int
-lv2_contexts_port_is_valid(uint32_t flags, uint32_t index) {
- return ((flags & (1 << index)) != 0);
+lv2_contexts_port_is_valid(const void* flags, uint32_t index) {
+ return (((uint8_t*)flags)[index / 8] & (1 << (index % 8))) != 0;
}
#include "lv2.h"
@@ -55,9 +55,9 @@ typedef struct {
* to that port in the duration of this function invocation.
* The plugin must return 1 if outputs have been written, 0 otherwise.
*/
- uint32_t (*message_run)(LV2_Handle instance,
- uint32_t* valid_inputs,
- uint32_t* valid_outputs);
+ uint32_t (*message_run)(LV2_Handle instance,
+ const void* valid_inputs,
+ void* valid_outputs);
/** The message thread function alalogous to the LV2 connect_port
* function. This function must only be used to connect ports that
diff --git a/src/calf/lv2wrap.h b/src/calf/lv2wrap.h
index d6dbf26..97dbf7d 100644
--- a/src/calf/lv2wrap.h
+++ b/src/calf/lv2wrap.h
@@ -115,7 +115,7 @@ struct lv2_instance: public plugin_ctl_iface, public Module
void send_configures(send_configure_iface *sci) {
Module::send_configures(sci);
}
- uint32_t impl_message_run(uint32_t *valid_inputs, uint32_t *output_ports) {
+ uint32_t impl_message_run(const void *valid_inputs, void *output_ports) {
for (unsigned int i = 0; i < message_params.size(); i++)
{
int pn = message_params[i];
@@ -257,7 +257,7 @@ struct lv2_wrapper
}
}
- static uint32_t cb_message_run(LV2_Handle Instance, uint32_t *valid_inputs, uint32_t *outputs_written) {
+ static uint32_t cb_message_run(LV2_Handle Instance, const void *valid_inputs, void *outputs_written) {
instance *mod = (instance *)Instance;
return mod->impl_message_run(valid_inputs, outputs_written);
}
@@ -324,74 +324,6 @@ struct lv2_wrapper
}
};
-template<class Module>
-struct lv2_small_wrapper
-{
- typedef Module instance;
- static LV2_Descriptor descriptor;
- std::string uri;
-
- lv2_small_wrapper(const char *id)
- {
- uri = "http://calf.sourceforge.net/small_plugins/" + std::string(id);
- descriptor.URI = uri.c_str();
- descriptor.instantiate = cb_instantiate;
- descriptor.connect_port = cb_connect;
- descriptor.activate = cb_activate;
- descriptor.run = cb_run;
- descriptor.deactivate = cb_deactivate;
- descriptor.cleanup = cb_cleanup;
- descriptor.extension_data = cb_ext_data;
- }
-
- static void cb_connect(LV2_Handle Instance, uint32_t port, void *DataLocation) {
- unsigned long ins = Module::in_count;
- unsigned long outs = Module::out_count;
- instance *const mod = (instance *)Instance;
- if (port < ins)
- mod->ins[port] = (float *)DataLocation;
- else if (port < ins + outs)
- mod->outs[port - ins] = (float *)DataLocation;
- }
-
- static void cb_activate(LV2_Handle Instance) {
- // Note the changed semantics (now more LV2-like)
- instance *const mod = (instance *)Instance;
- mod->activate();
- }
-
- static void cb_deactivate(LV2_Handle Instance) {
- instance *const mod = (instance *)Instance;
- mod->deactivate();
- }
-
- static LV2_Handle cb_instantiate(const LV2_Descriptor * Descriptor, double sample_rate, const char *bundle_path, const LV2_Feature *const *features)
- {
- instance *mod = new instance();
- // XXXKF some people use fractional sample rates; we respect them ;-)
- mod->set_bundle_path(bundle_path);
- mod->use_features(features);
- mod->set_sample_rate((uint32_t)sample_rate);
- return mod;
- }
-
- static void cb_run(LV2_Handle Instance, uint32_t SampleCount) {
- instance *const mod = (instance *)Instance;
- mod->process(SampleCount);
- }
-
- static void cb_cleanup(LV2_Handle Instance) {
- instance *const mod = (instance *)Instance;
- delete mod;
- }
-
- static const void *cb_ext_data(const char *URI) {
- return Module::ext_data(URI);
- }
-};
-
-extern const LV2_Descriptor *lv2_small_descriptor(uint32_t index);
-
};
#endif
diff --git a/src/calf/modules_small.h b/src/calf/modules_small.h
index b6781f7..5c6b653 100644
--- a/src/calf/modules_small.h
+++ b/src/calf/modules_small.h
@@ -23,6 +23,12 @@
#if USE_LV2
+#include "giface.h"
+#include "plugininfo.h"
+#include <string.h>
+
+namespace calf_plugins {
+
/// Empty implementations for plugin functions. Note, that functions aren't virtual, because they're called via the particular
/// subclass via template wrappers (ladspa_small_wrapper<> etc), not via base class pointer/reference
class null_small_audio_module
@@ -60,6 +66,82 @@ public:
float *outs[out_count];
};
+template<class Module>
+struct lv2_small_wrapper
+{
+ typedef Module instance;
+ static LV2_Descriptor descriptor;
+ std::string uri;
+ char *types;
+
+ lv2_small_wrapper(const char *id)
+ {
+ uri = "http://calf.sourceforge.net/small_plugins/" + std::string(id);
+ descriptor.URI = uri.c_str();
+ descriptor.instantiate = cb_instantiate;
+ descriptor.connect_port = cb_connect;
+ descriptor.activate = cb_activate;
+ descriptor.run = cb_run;
+ descriptor.deactivate = cb_deactivate;
+ descriptor.cleanup = cb_cleanup;
+ descriptor.extension_data = cb_ext_data;
+
+ std::string types_tmp;
+ plugin_port_type_grabber ptg(types_tmp);
+ Module::plugin_info(&ptg);
+ types = strdup(types_tmp.c_str());
+ }
+
+ static void cb_connect(LV2_Handle Instance, uint32_t port, void *DataLocation) {
+ unsigned long ins = Module::in_count;
+ unsigned long outs = Module::out_count;
+ instance *const mod = (instance *)Instance;
+ if (port < ins)
+ mod->ins[port] = (float *)DataLocation;
+ else if (port < ins + outs)
+ mod->outs[port - ins] = (float *)DataLocation;
+ }
+
+ static void cb_activate(LV2_Handle Instance) {
+ // Note the changed semantics (now more LV2-like)
+ instance *const mod = (instance *)Instance;
+ mod->activate();
+ }
+
+ static void cb_deactivate(LV2_Handle Instance) {
+ instance *const mod = (instance *)Instance;
+ mod->deactivate();
+ }
+
+ static LV2_Handle cb_instantiate(const LV2_Descriptor * Descriptor, double sample_rate, const char *bundle_path, const LV2_Feature *const *features)
+ {
+ instance *mod = new instance();
+ // XXXKF some people use fractional sample rates; we respect them ;-)
+ mod->set_bundle_path(bundle_path);
+ mod->use_features(features);
+ mod->set_sample_rate((uint32_t)sample_rate);
+ return mod;
+ }
+
+ static void cb_run(LV2_Handle Instance, uint32_t SampleCount) {
+ instance *const mod = (instance *)Instance;
+ mod->process(SampleCount);
+ }
+
+ static void cb_cleanup(LV2_Handle Instance) {
+ instance *const mod = (instance *)Instance;
+ delete mod;
+ }
+
+ static const void *cb_ext_data(const char *URI) {
+ return Module::ext_data(URI);
+ }
+};
+
+extern const LV2_Descriptor *lv2_small_descriptor(uint32_t index);
+
+};
+
#endif
#endif
diff --git a/src/calf/modules_synths.h b/src/calf/modules_synths.h
index a1fb5ee..142c01a 100644
--- a/src/calf/modules_synths.h
+++ b/src/calf/modules_synths.h
@@ -248,7 +248,7 @@ public:
char *configure(const char *key, const char *value);
void send_configures(send_configure_iface *);
- uint32_t message_run(uint32_t *valid_inputs, uint32_t *output_ports) {
+ uint32_t message_run(const void *valid_inputs, void *output_ports) {
// silence a default printf (which is kind of a warning about unhandled message_run)
return 0;
}
diff --git a/src/calf/plugininfo.h b/src/calf/plugininfo.h
index cca95cc..e934bcd 100644
--- a/src/calf/plugininfo.h
+++ b/src/calf/plugininfo.h
@@ -75,6 +75,38 @@ struct plugin_info_iface
virtual ~plugin_info_iface() {}
};
+struct plugin_port_type_grabber: public plugin_info_iface, public control_port_info_iface
+{
+ std::string &dest;
+
+ struct ppii: public plain_port_info_iface {
+ std::string ⌖
+ ppii(std::string &_target) : target (_target) {}
+ virtual plain_port_info_iface& output() {
+ target[target.length() - 1] &= ~32;
+ return *this;
+ }
+ };
+
+ struct cpii: public control_port_info_iface {
+ std::string ⌖
+ cpii(std::string &_target) : target (_target) {}
+ virtual control_port_info_iface& output() {
+ target[target.length() - 1] &= ~32;
+ return *this;
+ }
+ };
+
+ ppii pp;
+ cpii cp;
+
+ plugin_port_type_grabber(std::string &_dest) : dest(_dest), pp(_dest), cp(_dest) {}
+
+ virtual plain_port_info_iface &audio_port(const std::string &id, const std::string &name, const std::string µname = std::string("N/A")) { dest += 'a'; return pp; }
+ virtual plain_port_info_iface &event_port(const std::string &id, const std::string &name, const std::string µname = std::string("N/A")) { dest += 'e'; return pp; }
+ virtual control_port_info_iface &control_port(const std::string &id, const std::string &name, double def_value, const std::string µname = "N/A") { dest += 'c'; return cp; }
+};
+
/// A sink to send information about plugins
struct plugin_list_info_iface
{
diff --git a/src/modules_small.cpp b/src/modules_small.cpp
index 3bc788d..47e1be2 100644
--- a/src/modules_small.cpp
+++ b/src/modules_small.cpp
@@ -1250,12 +1250,14 @@ public:
void process(uint32_t)
{
}
- static uint32_t message_run(LV2_Handle instance, uint32_t *valid_inputs, uint32_t *outputs_written)
+ static uint32_t message_run(LV2_Handle instance, const void *valid_inputs, void *outputs_written)
{
print_em_audio_module *self = (print_em_audio_module *)instance;
- printf("message_run (events = %p, count = %d)\n", self->events, self->events->event_count);
- self->dump(self->events);
- *outputs_written = 0;
+ if (lv2_contexts_port_is_valid(valid_inputs, 0))
+ {
+ printf("message_run (events = %p, count = %d)\n", self->events, self->events->event_count);
+ self->dump(self->events);
+ }
return 0;
}
static void message_connect_port(LV2_Handle instance, uint32_t port, void* data)
@@ -1292,27 +1294,35 @@ public:
void process(uint32_t)
{
}
- static uint32_t message_run(LV2_Handle instance, uint32_t *valid_inputs, uint32_t *outputs_written)
+ static uint32_t message_run(LV2_Handle instance, const void *valid_inputs, void *outputs_written)
{
copy_em_audio_module *self = (copy_em_audio_module *)instance;
return self->message_run(valid_inputs, outputs_written);
}
- uint32_t message_run(uint32_t *inputs_written, uint32_t *outputs_written)
+ uint32_t message_run(const void *inputs_written, void *outputs_written)
{
- event_port_read_iterator ri(events_in);
- event_port_write_iterator wi(events_out);
- if (events_in->size > events_out->capacity)
+ if (lv2_contexts_port_is_valid(inputs_written, 0))
{
- printf("Buffer capacity exceeded!\n");
- return false;
- }
- while(ri)
- {
- const lv2_event &event = *ri++;
- *wi++ = event;
+ event_port_read_iterator ri(events_in);
+ event_port_write_iterator wi(events_out);
+ if (events_in->size > events_out->capacity)
+ {
+ printf("Buffer capacity exceeded!\n");
+ return false;
+ }
+ while(ri)
+ {
+ const lv2_event &event = *ri++;
+ *wi++ = event;
+ }
+ if (events_in->event_count != 0)
+ {
+ lv2_contexts_set_port_valid(outputs_written, 1);
+ return 1;
+ }
}
- *outputs_written = (events_in->event_count != 0) ? 2 : 0;
- return *outputs_written != 0 ? 1 : 0;
+ lv2_contexts_unset_port_valid(outputs_written, 1);
+ return 0;
}
static void message_connect_port(LV2_Handle instance, uint32_t port, void* data)
{
diff --git a/src/plugin.cpp b/src/plugin.cpp
index 380cc9b..f249989 100644
--- a/src/plugin.cpp
+++ b/src/plugin.cpp
@@ -23,6 +23,7 @@
#include <calf/lv2wrap.h>
#include <calf/modules.h>
#include <calf/modules_dev.h>
+#include <calf/modules_small.h>
using namespace calf_plugins;
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list