[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 &microname = 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 &microname = 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 &microname = "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