From 3444a46f4b058f5c0066320914c56bd1b417d06f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 11 Aug 2012 03:28:57 +0000 Subject: Make sum, product, and difference plugins vectorizable. Improve const correctness. git-svn-id: http://svn.drobilla.net/lad/trunk/plugins/blop.lv2@4652 a436a847-0d15-0410-975c-d299462d15a1 --- src/difference.c | 50 +++++++++++++++++++------------------------------- 1 file changed, 19 insertions(+), 31 deletions(-) (limited to 'src/difference.c') diff --git a/src/difference.c b/src/difference.c index 61a59e9..e886a09 100644 --- a/src/difference.c +++ b/src/difference.c @@ -21,19 +21,20 @@ #include "lv2/lv2plug.in/ns/ext/morph/morph.h" #include "lv2/lv2plug.in/ns/lv2core/lv2.h" #include "uris.h" +#include "vector_op.h" #define DIFFERENCE_MINUEND 0 #define DIFFERENCE_SUBTRAHEND 1 #define DIFFERENCE_DIFFERENCE 2 typedef struct { - float* minuend; - float* subtrahend; - float* difference; - uint32_t minuend_is_cv; - uint32_t subtrahend_is_cv; - uint32_t difference_is_cv; - URIs uris; + const float* minuend; + const float* subtrahend; + float* difference; + uint32_t minuend_is_cv; + uint32_t subtrahend_is_cv; + uint32_t difference_is_cv; + URIs uris; } Difference; static void @@ -51,10 +52,10 @@ connect_port(LV2_Handle instance, switch (port) { case DIFFERENCE_MINUEND: - plugin->minuend = (float*)data; + plugin->minuend = (const float*)data; break; case DIFFERENCE_SUBTRAHEND: - plugin->subtrahend = (float*)data; + plugin->subtrahend = (const float*)data; break; case DIFFERENCE_DIFFERENCE: plugin->difference = (float*)data; @@ -97,7 +98,7 @@ port_type(LV2_Handle instance, uint32_t port, LV2_Morph_Property*const* properties) { - Difference* plugin = (Difference*)instance; + const Difference* plugin = (const Difference*)instance; switch (port) { case DIFFERENCE_DIFFERENCE: @@ -133,27 +134,14 @@ static void run(LV2_Handle instance, uint32_t sample_count) { - Difference* plugin = (Difference*)instance; - - /* Minuend (array of floats of length 1 or sample_count) */ - const float* minuend = plugin->minuend; - - /* Subtrahend (array of floats of length 1 or sample_count) */ - const float* subtrahend = plugin->subtrahend; - - /* Difference (array of floats of length 1 or sample_count) */ - float* difference = plugin->difference; - - if (!plugin->difference_is_cv) { /* TODO: Avoid this branch */ - sample_count = 1; - } - - for (uint32_t s = 0; s < sample_count; ++s) { - const float min = minuend[s * plugin->minuend_is_cv]; - const float sub = subtrahend[s * plugin->subtrahend_is_cv]; - - difference[s] = min - sub; - } + const Difference* const plugin = (Difference*)instance; + const float* const minuend = plugin->minuend; + const float* const subtrahend = plugin->subtrahend; + float* const difference = plugin->difference; + + VECTOR_OP(-, difference, + minuend, plugin->minuend_is_cv, + subtrahend, plugin->subtrahend_is_cv); } static const void* -- cgit v1.2.1