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/adsr.c | 38 +++++++++++++------------- src/adsr_gt.c | 40 +++++++++++++-------------- src/amp.c | 4 +-- src/branch.c | 8 +++--- src/dahdsr.c | 64 ++++++++++++++++++++++---------------------- src/difference.c | 50 +++++++++++++--------------------- src/fmod.c | 20 +++++++------- src/include/lp4pole_filter.h | 2 +- src/include/vector_op.h | 44 ++++++++++++++++++++++++++++++ src/interpolator.c | 10 +++---- src/lp4pole.c | 12 ++++----- src/product.c | 49 +++++++++++++-------------------- src/pulse.c | 20 +++++++------- src/quantiser.c | 36 ++++++++++++------------- src/random.c | 26 +++++++++--------- src/ratio.c | 22 +++++++-------- src/sawtooth.c | 14 +++++----- src/sequencer.c | 24 ++++++++--------- src/square.c | 14 +++++----- src/sum.c | 49 +++++++++++++-------------------- src/sync_pulse.c | 26 +++++++++--------- src/sync_square.c | 20 +++++++------- src/tracker.c | 40 +++++++++++++-------------- src/triangle.c | 24 ++++++++--------- 24 files changed, 333 insertions(+), 323 deletions(-) create mode 100644 src/include/vector_op.h diff --git a/src/adsr.c b/src/adsr.c index 8c2c041..a84469f 100644 --- a/src/adsr.c +++ b/src/adsr.c @@ -38,19 +38,19 @@ typedef enum { } ADSRState; typedef struct { - float* signal; - float* trigger; - float* attack; - float* decay; - float* sustain; - float* release; - float* output; - float srate; - float inv_srate; - float from_level; - float level; - ADSRState state; - uint32_t samples; + const float* signal; + const float* trigger; + const float* attack; + const float* decay; + const float* sustain; + const float* release; + float* output; + float srate; + float inv_srate; + float from_level; + float level; + ADSRState state; + uint32_t samples; } Adsr; static void @@ -68,22 +68,22 @@ connect_port(LV2_Handle instance, switch (port) { case ADSR_SIGNAL: - plugin->signal = (float*)data; + plugin->signal = (const float*)data; break; case ADSR_TRIGGER: - plugin->trigger = (float*)data; + plugin->trigger = (const float*)data; break; case ADSR_ATTACK: - plugin->attack = (float*)data; + plugin->attack = (const float*)data; break; case ADSR_DECAY: - plugin->decay = (float*)data; + plugin->decay = (const float*)data; break; case ADSR_SUSTAIN: - plugin->sustain = (float*)data; + plugin->sustain = (const float*)data; break; case ADSR_RELEASE: - plugin->release = (float*)data; + plugin->release = (const float*)data; break; case ADSR_OUTPUT: plugin->output = (float*)data; diff --git a/src/adsr_gt.c b/src/adsr_gt.c index a660e3e..4f23649 100644 --- a/src/adsr_gt.c +++ b/src/adsr_gt.c @@ -38,20 +38,20 @@ typedef enum { } ADSRState; typedef struct { - float* gate; - float* trigger; - float* attack; - float* decay; - float* sustain; - float* release; - float* output; - float srate; - float inv_srate; - float last_trigger; - float from_level; - float level; - ADSRState state; - uint32_t samples; + const float* gate; + const float* trigger; + const float* attack; + const float* decay; + const float* sustain; + const float* release; + float* output; + float srate; + float inv_srate; + float last_trigger; + float from_level; + float level; + ADSRState state; + uint32_t samples; } Adsr; static void @@ -69,22 +69,22 @@ connect_port(LV2_Handle instance, switch (port) { case ADSR_GATE: - plugin->gate = (float*)data; + plugin->gate = (const float*)data; break; case ADSR_TRIGGER: - plugin->trigger = (float*)data; + plugin->trigger = (const float*)data; break; case ADSR_ATTACK: - plugin->attack = (float*)data; + plugin->attack = (const float*)data; break; case ADSR_DECAY: - plugin->decay = (float*)data; + plugin->decay = (const float*)data; break; case ADSR_SUSTAIN: - plugin->sustain = (float*)data; + plugin->sustain = (const float*)data; break; case ADSR_RELEASE: - plugin->release = (float*)data; + plugin->release = (const float*)data; break; case ADSR_OUTPUT: plugin->output = (float*)data; diff --git a/src/amp.c b/src/amp.c index 5bcd339..96ef690 100644 --- a/src/amp.c +++ b/src/amp.c @@ -50,10 +50,10 @@ connect_port(LV2_Handle instance, switch (port) { case AMP_GAIN: - plugin->gain = (float*)data; + plugin->gain = (const float*)data; break; case AMP_INPUT: - plugin->input = (float*)data; + plugin->input = (const float*)data; break; case AMP_OUTPUT: plugin->output = (float*)data; diff --git a/src/branch.c b/src/branch.c index c74e316..5ec0fff 100644 --- a/src/branch.c +++ b/src/branch.c @@ -26,9 +26,9 @@ #define BRANCH_OUTPUT2 2 typedef struct { - float* input; - float* output1; - float* output2; + const float* input; + float* output1; + float* output2; } Branch; static void @@ -46,7 +46,7 @@ connect_port(LV2_Handle instance, switch (port) { case BRANCH_INPUT: - plugin->input = (float*)data; + plugin->input = (const float*)data; break; case BRANCH_OUTPUT1: plugin->output1 = (float*)data; diff --git a/src/dahdsr.c b/src/dahdsr.c index 99f29de..00c1b3e 100644 --- a/src/dahdsr.c +++ b/src/dahdsr.c @@ -44,30 +44,30 @@ typedef enum { } DAHDSRState; typedef struct { - float* gate; - float* trigger; - float* delay; - float* attack; - float* hold; - float* decay; - float* sustain; - float* release; - float* output; - float srate; - float inv_srate; - float last_gate; - float last_trigger; - float from_level; - float level; - uint32_t delay_is_cv; - uint32_t attack_is_cv; - uint32_t hold_is_cv; - uint32_t decay_is_cv; - uint32_t sustain_is_cv; - uint32_t release_is_cv; - DAHDSRState state; - uint32_t samples; - URIs uris; + const float* gate; + const float* trigger; + const float* delay; + const float* attack; + const float* hold; + const float* decay; + const float* sustain; + const float* release; + float* output; + float srate; + float inv_srate; + float last_gate; + float last_trigger; + float from_level; + float level; + uint32_t delay_is_cv; + uint32_t attack_is_cv; + uint32_t hold_is_cv; + uint32_t decay_is_cv; + uint32_t sustain_is_cv; + uint32_t release_is_cv; + DAHDSRState state; + uint32_t samples; + URIs uris; } Dahdsr; static void @@ -85,28 +85,28 @@ connect_port(LV2_Handle instance, switch (port) { case DAHDSR_GATE: - plugin->gate = (float*)data; + plugin->gate = (const float*)data; break; case DAHDSR_TRIGGER: - plugin->trigger = (float*)data; + plugin->trigger = (const float*)data; break; case DAHDSR_DELAY: - plugin->delay = (float*)data; + plugin->delay = (const float*)data; break; case DAHDSR_ATTACK: - plugin->attack = (float*)data; + plugin->attack = (const float*)data; break; case DAHDSR_HOLD: - plugin->hold = (float*)data; + plugin->hold = (const float*)data; break; case DAHDSR_DECAY: - plugin->decay = (float*)data; + plugin->decay = (const float*)data; break; case DAHDSR_SUSTAIN: - plugin->sustain = (float*)data; + plugin->sustain = (const float*)data; break; case DAHDSR_RELEASE: - plugin->release = (float*)data; + plugin->release = (const float*)data; break; case DAHDSR_OUTPUT: plugin->output = (float*)data; 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* diff --git a/src/fmod.c b/src/fmod.c index de972ce..95c243e 100644 --- a/src/fmod.c +++ b/src/fmod.c @@ -28,13 +28,13 @@ #define FMOD_OUTPUT 2 typedef struct { - float* frequency; - float* modulator; - float* output; - uint32_t frequency_is_cv; - uint32_t modulator_is_cv; - uint32_t output_is_cv; - URIs uris; + const float* frequency; + const float* modulator; + float* output; + uint32_t frequency_is_cv; + uint32_t modulator_is_cv; + uint32_t output_is_cv; + URIs uris; } Fmod; static void @@ -52,10 +52,10 @@ connect_port(LV2_Handle instance, switch (port) { case FMOD_FREQUENCY: - plugin->frequency = (float*)data; + plugin->frequency = (const float*)data; break; case FMOD_MODULATOR: - plugin->modulator = (float*)data; + plugin->modulator = (const float*)data; break; case FMOD_OUTPUT: plugin->output = (float*)data; @@ -96,7 +96,7 @@ port_type(LV2_Handle instance, uint32_t port, LV2_Morph_Property*const* properties) { - Fmod* plugin = (Fmod*)instance; + const Fmod* plugin = (const Fmod*)instance; switch (port) { case FMOD_OUTPUT: diff --git a/src/include/lp4pole_filter.h b/src/include/lp4pole_filter.h index a6b27f1..310fbbe 100644 --- a/src/include/lp4pole_filter.h +++ b/src/include/lp4pole_filter.h @@ -110,7 +110,7 @@ static inline float lp4pole_run(LP4PoleFilter* lpf, float in) { - float abs_in = fabsf(16.0f * in); /* ~24dB unclipped headroom */ + const float abs_in = fabsf(16.0f * in); /* ~24dB unclipped headroom */ lpf->max_abs_in = f_max(lpf->max_abs_in, abs_in); diff --git a/src/include/vector_op.h b/src/include/vector_op.h new file mode 100644 index 0000000..f8ea8dd --- /dev/null +++ b/src/include/vector_op.h @@ -0,0 +1,44 @@ +/* + Apply a C arithmetical operator to two sample buffers. + Copyright 2012 David Robillard + + This is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this software. If not, see . +*/ + +#ifndef BLOP_VECTOR_OP_H +#define BLOP_VECTOR_OP_H + +#define VECTOR_OP(op, output, input1, input1_is_cv, input2, input2_is_cv) \ + switch ((input1_is_cv << 1) + input2_is_cv) { \ + case 0: /* 00 (control * control) */ \ + output[0] = input1[0] * input2[0]; \ + break; \ + case 1: /* 01 (control * cv) */ \ + for (uint32_t s = 0; s < sample_count; ++s) { \ + output[s] = input1[0] * input2[s]; \ + } \ + break; \ + case 2: /* 10 (cv * control) */ \ + for (uint32_t s = 0; s < sample_count; ++s) { \ + output[s] = input1[s] * input2[0]; \ + } \ + break; \ + case 3: /* 11 (cv * cv) */ \ + for (uint32_t s = 0; s < sample_count; ++s) { \ + output[s] = input1[s] * input2[s]; \ + } \ + break; \ + } + +#endif /* BLOP_VECTOR_OP_H */ diff --git a/src/interpolator.c b/src/interpolator.c index 84ddd5d..e47fbe3 100644 --- a/src/interpolator.c +++ b/src/interpolator.c @@ -43,10 +43,10 @@ interpolate(float interval, } typedef struct { - float* input; - float* output; - float p1; - float p0; + const float* input; + float* output; + float p1; + float p0; } Interpolator; static void @@ -64,7 +64,7 @@ connect_port(LV2_Handle instance, switch (port) { case INTERPOLATOR_INPUT: - plugin->input = (float*)data; + plugin->input = (const float*)data; break; case INTERPOLATOR_OUTPUT: plugin->output = (float*)data; diff --git a/src/lp4pole.c b/src/lp4pole.c index 07d8b48..27b1ae0 100644 --- a/src/lp4pole.c +++ b/src/lp4pole.c @@ -30,9 +30,9 @@ #define LP4POLE_OUTPUT 3 typedef struct { - float* cutoff; - float* resonance; - float* input; + const float* cutoff; + const float* resonance; + const float* input; float* output; LP4PoleFilter* lpf; uint32_t cutoff_is_cv; @@ -59,13 +59,13 @@ connect_port(LV2_Handle instance, switch (port) { case LP4POLE_CUTOFF: - plugin->cutoff = (float*)data; + plugin->cutoff = (const float*)data; break; case LP4POLE_RESONANCE: - plugin->resonance = (float*)data; + plugin->resonance = (const float*)data; break; case LP4POLE_INPUT: - plugin->input = (float*)data; + plugin->input = (const float*)data; break; case LP4POLE_OUTPUT: plugin->output = (float*)data; diff --git a/src/product.c b/src/product.c index 194a071..ea07ee6 100644 --- a/src/product.c +++ b/src/product.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 PRODUCT_MULTIPLICAND 0 #define PRODUCT_MULTIPLIER 1 #define PRODUCT_PRODUCT 2 typedef struct { - float* input1; - float* input2; - float* output; - uint32_t input1_is_cv; - uint32_t input2_is_cv; - uint32_t output_is_cv; - URIs uris; + const float* input1; + const float* input2; + float* output; + uint32_t input1_is_cv; + uint32_t input2_is_cv; + uint32_t output_is_cv; + URIs uris; } Product; static void @@ -51,10 +52,10 @@ connect_port(LV2_Handle instance, switch (port) { case PRODUCT_MULTIPLICAND: - plugin->input1 = (float*)data; + plugin->input1 = (const float*)data; break; case PRODUCT_MULTIPLIER: - plugin->input2 = (float*)data; + plugin->input2 = (const float*)data; break; case PRODUCT_PRODUCT: plugin->output = (float*)data; @@ -95,7 +96,7 @@ port_type(LV2_Handle instance, uint32_t port, LV2_Morph_Property*const* properties) { - Product* plugin = (Product*)instance; + const Product* plugin = (const Product*)instance; switch (port) { case PRODUCT_PRODUCT: @@ -131,26 +132,14 @@ static void run(LV2_Handle instance, uint32_t sample_count) { - Product* plugin = (Product*)instance; - - /* First Input (array of floats of length 1 or sample_count) */ - const float* input1 = plugin->input1; - - /* Second Input (array of floats of length 1 or sample_count) */ - const float* input2 = plugin->input2; - - /* Output (array of floats of length sample_count) */ - float* output = plugin->output; - - if (!plugin->output_is_cv) { /* TODO: Avoid this branch */ - sample_count = 1; - } - - for (uint32_t s = 0; s < sample_count; ++s) { - const float in1 = input1[s * plugin->input1_is_cv]; - const float in2 = input2[s * plugin->input2_is_cv]; - output[s] = in1 * in2; - } + const Product* const plugin = (Product*)instance; + const float* const input1 = plugin->input1; + const float* const input2 = plugin->input2; + float* const output = plugin->output; + + VECTOR_OP(*, output, + input1, plugin->input1_is_cv, + input2, plugin->input2_is_cv); } static const void* diff --git a/src/pulse.c b/src/pulse.c index bffe4ea..b59caf8 100644 --- a/src/pulse.c +++ b/src/pulse.c @@ -28,14 +28,14 @@ #define PULSE_OUTPUT 2 typedef struct { - float* frequency; - float* pulsewidth; - float* output; - float phase; - uint32_t frequency_is_cv; - uint32_t pulsewidth_is_cv; - Wavedata wdat; - URIs uris; + const float* frequency; + const float* pulsewidth; + float* output; + float phase; + uint32_t frequency_is_cv; + uint32_t pulsewidth_is_cv; + Wavedata wdat; + URIs uris; } Pulse; static void @@ -47,10 +47,10 @@ connect_port(LV2_Handle instance, switch (port) { case PULSE_FREQUENCY: - plugin->frequency = (float*)data; + plugin->frequency = (const float*)data; break; case PULSE_PULSEWIDTH: - plugin->pulsewidth = (float*)data; + plugin->pulsewidth = (const float*)data; break; case PULSE_OUTPUT: plugin->output = (float*)data; diff --git a/src/quantiser.c b/src/quantiser.c index ccf9fb3..ed3ae1d 100644 --- a/src/quantiser.c +++ b/src/quantiser.c @@ -34,18 +34,18 @@ #define QUANTISER_OUTPUT_CHANGED (QUANTISER_MAX_INPUTS + 7) typedef struct { - float* min; - float* max; - float* match_range; - float* mode; - float* count; - float* values[QUANTISER_MAX_INPUTS]; - float* input; - float* output_changed; - float* output; - float svalues[QUANTISER_MAX_INPUTS + 2]; - float temp[QUANTISER_MAX_INPUTS + 2]; - float last_found; + const float* min; + const float* max; + const float* match_range; + const float* mode; + const float* count; + const float* values[QUANTISER_MAX_INPUTS]; + const float* input; + float* output_changed; + float* output; + float svalues[QUANTISER_MAX_INPUTS + 2]; + float temp[QUANTISER_MAX_INPUTS + 2]; + float last_found; } Quantiser; /* @@ -170,22 +170,22 @@ connect_port(LV2_Handle instance, switch (port) { case QUANTISER_RANGE_MIN: - plugin->min = (float*)data; + plugin->min = (const float*)data; break; case QUANTISER_RANGE_MAX: - plugin->max = (float*)data; + plugin->max = (const float*)data; break; case QUANTISER_MATCH_RANGE: - plugin->match_range = (float*)data; + plugin->match_range = (const float*)data; break; case QUANTISER_MODE: - plugin->mode = (float*)data; + plugin->mode = (const float*)data; break; case QUANTISER_COUNT: - plugin->count = (float*)data; + plugin->count = (const float*)data; break; case QUANTISER_INPUT: - plugin->input = (float*)data; + plugin->input = (const float*)data; break; case QUANTISER_OUTPUT: plugin->output = (float*)data; diff --git a/src/random.c b/src/random.c index 8737bff..2239d48 100644 --- a/src/random.c +++ b/src/random.c @@ -30,17 +30,17 @@ #define RANDOM_OUTPUT 2 typedef struct { - float* frequency; - float* smooth; - float* output; - float nyquist; - float inv_nyquist; - float phase; - float value1; - float value2; - uint32_t frequency_is_cv; - uint32_t smooth_is_cv; - URIs uris; + const float* frequency; + const float* smooth; + float* output; + float nyquist; + float inv_nyquist; + float phase; + float value1; + float value2; + uint32_t frequency_is_cv; + uint32_t smooth_is_cv; + URIs uris; } Random; float inv_rand_max; @@ -60,10 +60,10 @@ connect_port(LV2_Handle instance, switch (port) { case RANDOM_FREQUENCY: - plugin->frequency = (float*)data; + plugin->frequency = (const float*)data; break; case RANDOM_SMOOTH: - plugin->smooth = (float*)data; + plugin->smooth = (const float*)data; break; case RANDOM_OUTPUT: plugin->output = (float*)data; diff --git a/src/ratio.c b/src/ratio.c index 567cca6..57cb6a5 100644 --- a/src/ratio.c +++ b/src/ratio.c @@ -29,13 +29,13 @@ #define RATIO_OUTPUT 2 typedef struct { - float* numerator; - float* denominator; - float* output; - uint32_t numerator_is_cv; - uint32_t denominator_is_cv; - uint32_t output_is_cv; - URIs uris; + const float* numerator; + const float* denominator; + float* output; + uint32_t numerator_is_cv; + uint32_t denominator_is_cv; + uint32_t output_is_cv; + URIs uris; } Ratio; static void @@ -53,10 +53,10 @@ connect_port(LV2_Handle instance, switch (port) { case RATIO_NUMERATOR: - plugin->numerator = (float*)data; + plugin->numerator = (const float*)data; break; case RATIO_DENOMINATOR: - plugin->denominator = (float*)data; + plugin->denominator = (const float*)data; break; case RATIO_OUTPUT: plugin->output = (float*)data; @@ -97,7 +97,7 @@ port_type(LV2_Handle instance, uint32_t port, LV2_Morph_Property*const* properties) { - Ratio* plugin = (Ratio*)instance; + const Ratio* plugin = (const Ratio*)instance; switch (port) { case RATIO_OUTPUT: @@ -138,7 +138,7 @@ run(LV2_Handle instance, const float* numerator = plugin->numerator; /* Denominator (array of floats of length sample_count) */ - float* denominator = plugin->denominator; + const float* denominator = plugin->denominator; /* Output (array of floats of length sample_count) */ float* output = plugin->output; diff --git a/src/sawtooth.c b/src/sawtooth.c index 7106830..8667f73 100644 --- a/src/sawtooth.c +++ b/src/sawtooth.c @@ -27,12 +27,12 @@ #define SAWTOOTH_OUTPUT 1 typedef struct { - float* frequency; - float* output; - float phase; - uint32_t frequency_is_cv; - Wavedata wdat; - URIs uris; + const float* frequency; + float* output; + float phase; + uint32_t frequency_is_cv; + Wavedata wdat; + URIs uris; } Sawtooth; static void @@ -44,7 +44,7 @@ connect_port(LV2_Handle instance, switch (port) { case SAWTOOTH_FREQUENCY: - plugin->frequency = (float*)data; + plugin->frequency = (const float*)data; break; case SAWTOOTH_OUTPUT: plugin->output = (float*)data; diff --git a/src/sequencer.c b/src/sequencer.c index ec218bb..939401b 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -32,12 +32,12 @@ #define SEQUENCER_OUTPUT (SEQUENCER_MAX_INPUTS + 5) typedef struct { - float* gate; - float* trigger; - float* loop_steps; - float* reset; - float* value_gate_closed; - float* values[SEQUENCER_MAX_INPUTS]; + const float* gate; + const float* trigger; + const float* loop_steps; + const float* reset; + const float* value_gate_closed; + const float* values[SEQUENCER_MAX_INPUTS]; float* output; float srate; float inv_srate; @@ -62,26 +62,26 @@ connect_port(LV2_Handle instance, switch (port) { case SEQUENCER_GATE: - plugin->gate = (float*)data; + plugin->gate = (const float*)data; break; case SEQUENCER_TRIGGER: - plugin->trigger = (float*)data; + plugin->trigger = (const float*)data; break; case SEQUENCER_LOOP_POINT: - plugin->loop_steps = (float*)data; + plugin->loop_steps = (const float*)data; break; case SEQUENCER_OUTPUT: plugin->output = (float*)data; break; case SEQUENCER_RESET: - plugin->reset = (float*)data; + plugin->reset = (const float*)data; break; case SEQUENCER_VALUE_GATE_CLOSED: - plugin->value_gate_closed = (float*)data; + plugin->value_gate_closed = (const float*)data; break; default: if (port >= SEQUENCER_VALUE_START && port < SEQUENCER_OUTPUT) { - plugin->values[port - SEQUENCER_VALUE_START] = (float*)data; + plugin->values[port - SEQUENCER_VALUE_START] = (const float*)data; } break; } diff --git a/src/square.c b/src/square.c index e7cb941..1425114 100644 --- a/src/square.c +++ b/src/square.c @@ -27,12 +27,12 @@ #define SQUARE_OUTPUT 1 typedef struct { - float* frequency; - float* output; - float phase; - uint32_t frequency_is_cv; - Wavedata wdat; - URIs uris; + const float* frequency; + float* output; + float phase; + uint32_t frequency_is_cv; + Wavedata wdat; + URIs uris; } Square; static void @@ -44,7 +44,7 @@ connect_port(LV2_Handle instance, switch (port) { case SQUARE_FREQUENCY: - plugin->frequency = (float*)data; + plugin->frequency = (const float*)data; break; case SQUARE_OUTPUT: plugin->output = (float*)data; diff --git a/src/sum.c b/src/sum.c index 5c9c1c6..5665447 100644 --- a/src/sum.c +++ b/src/sum.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 SUM_INPUT1 0 #define SUM_INPUT2 1 #define SUM_OUTPUT 2 typedef struct { - float* input1; - float* input2; - float* output; - uint32_t input1_is_cv; - uint32_t input2_is_cv; - uint32_t output_is_cv; - URIs uris; + const float* input1; + const float* input2; + float* output; + uint32_t input1_is_cv; + uint32_t input2_is_cv; + uint32_t output_is_cv; + URIs uris; } Sum; static void @@ -51,10 +52,10 @@ connect_port(LV2_Handle instance, switch (port) { case SUM_INPUT1: - plugin->input1 = (float*)data; + plugin->input1 = (const float*)data; break; case SUM_INPUT2: - plugin->input2 = (float*)data; + plugin->input2 = (const float*)data; break; case SUM_OUTPUT: plugin->output = (float*)data; @@ -95,7 +96,7 @@ port_type(LV2_Handle instance, uint32_t port, LV2_Morph_Property*const* properties) { - Sum* plugin = (Sum*)instance; + const Sum* plugin = (const Sum*)instance; switch (port) { case SUM_OUTPUT: @@ -130,26 +131,14 @@ static void run(LV2_Handle instance, uint32_t sample_count) { - Sum* plugin = (Sum*)instance; - - /* First Input (array of floats of length sample_count) */ - const float* input1 = plugin->input1; - - /* Second Input (array of floats of length sample_count) */ - const float* input2 = plugin->input2; - - /* Output (array of floats of length sample_count) */ - float* output = plugin->output; - - if (!plugin->output_is_cv) { /* TODO: Avoid this branch */ - sample_count = 1; - } - - for (uint32_t s = 0; s < sample_count; ++s) { - const float in1 = input1[s * plugin->input1_is_cv]; - const float in2 = input2[s * plugin->input2_is_cv]; - output[s] = in1 + in2; - } + const Sum* const plugin = (Sum*)instance; + const float* const input1 = plugin->input1; + const float* const input2 = plugin->input2; + float* const output = plugin->output; + + VECTOR_OP(+, output, + input1, plugin->input1_is_cv, + input2, plugin->input2_is_cv); } static const void* diff --git a/src/sync_pulse.c b/src/sync_pulse.c index 719115f..b1be0ac 100644 --- a/src/sync_pulse.c +++ b/src/sync_pulse.c @@ -30,15 +30,15 @@ #define SYNCPULSE_OUTPUT 3 typedef struct { - float* frequency; - float* pulsewidth; - float* gate; - float* output; - float srate; - float phase; - uint32_t frequency_is_cv; - uint32_t pulsewidth_is_cv; - URIs uris; + const float* frequency; + const float* pulsewidth; + const float* gate; + float* output; + float srate; + float phase; + uint32_t frequency_is_cv; + uint32_t pulsewidth_is_cv; + URIs uris; } SyncPulse; static void @@ -56,13 +56,13 @@ connect_port(LV2_Handle instance, switch (port) { case SYNCPULSE_FREQUENCY: - plugin->frequency = (float*)data; + plugin->frequency = (const float*)data; break; case SYNCPULSE_PULSEWIDTH: - plugin->pulsewidth = (float*)data; + plugin->pulsewidth = (const float*)data; break; case SYNCPULSE_GATE: - plugin->gate = (float*)data; + plugin->gate = (const float*)data; break; case SYNCPULSE_OUTPUT: plugin->output = (float*)data; @@ -133,7 +133,7 @@ run(LV2_Handle instance, const float* frequency = plugin->frequency; /* Pulse Width (array of float of length sample_count) */ - float* pulsewidth = plugin->pulsewidth; + const float* pulsewidth = plugin->pulsewidth; /* Gate (array of float of length sample_count) */ const float* gate = plugin->gate; diff --git a/src/sync_square.c b/src/sync_square.c index f3c5ce8..4ac7d1a 100644 --- a/src/sync_square.c +++ b/src/sync_square.c @@ -28,14 +28,14 @@ #define SYNCSQUARE_OUTPUT 2 typedef struct { - float* frequency; - float* gate; - float* output; - float srate; - float nyquist; - float phase; - uint32_t frequency_is_cv; - URIs uris; + const float* frequency; + const float* gate; + float* output; + float srate; + float nyquist; + float phase; + uint32_t frequency_is_cv; + URIs uris; } SyncSquare; static void @@ -53,10 +53,10 @@ connect_port(LV2_Handle instance, switch (port) { case SYNCSQUARE_FREQUENCY: - plugin->frequency = (float*)data; + plugin->frequency = (const float*)data; break; case SYNCSQUARE_GATE: - plugin->gate = (float*)data; + plugin->gate = (const float*)data; break; case SYNCSQUARE_OUTPUT: plugin->output = (float*)data; diff --git a/src/tracker.c b/src/tracker.c index 84742d2..3ff92c6 100644 --- a/src/tracker.c +++ b/src/tracker.c @@ -32,20 +32,20 @@ #define TRACKER_OUTPUT 6 typedef struct { - float* gate; - float* hattack; - float* hdecay; - float* lattack; - float* ldecay; - float* input; - float* output; - float coeff; - float last_value; - uint32_t hattack_is_cv; - uint32_t hdecay_is_cv; - uint32_t lattack_is_cv; - uint32_t ldecay_is_cv; - URIs uris; + const float* gate; + const float* hattack; + const float* hdecay; + const float* lattack; + const float* ldecay; + const float* input; + float* output; + float coeff; + float last_value; + uint32_t hattack_is_cv; + uint32_t hdecay_is_cv; + uint32_t lattack_is_cv; + uint32_t ldecay_is_cv; + URIs uris; } Tracker; static void @@ -63,22 +63,22 @@ connect_port(LV2_Handle instance, switch (port) { case TRACKER_GATE: - plugin->gate = (float*)data; + plugin->gate = (const float*)data; break; case TRACKER_HATTACK: - plugin->hattack = (float*)data; + plugin->hattack = (const float*)data; break; case TRACKER_HDECAY: - plugin->hdecay = (float*)data; + plugin->hdecay = (const float*)data; break; case TRACKER_LATTACK: - plugin->lattack = (float*)data; + plugin->lattack = (const float*)data; break; case TRACKER_LDECAY: - plugin->ldecay = (float*)data; + plugin->ldecay = (const float*)data; break; case TRACKER_INPUT: - plugin->input = (float*)data; + plugin->input = (const float*)data; break; case TRACKER_OUTPUT: plugin->output = (float*)data; diff --git a/src/triangle.c b/src/triangle.c index 1189b06..fb03f7b 100644 --- a/src/triangle.c +++ b/src/triangle.c @@ -28,16 +28,16 @@ #define TRIANGLE_OUTPUT 2 typedef struct { - float* frequency; - float* slope; - float* output; - float phase; - float min_slope; - float max_slope; - uint32_t frequency_is_cv; - uint32_t slope_is_cv; - Wavedata wdat; - URIs uris; + const float* frequency; + const float* slope; + float* output; + float phase; + float min_slope; + float max_slope; + uint32_t frequency_is_cv; + uint32_t slope_is_cv; + Wavedata wdat; + URIs uris; } Triangle; static void @@ -49,10 +49,10 @@ connect_port(LV2_Handle instance, switch (port) { case TRIANGLE_FREQUENCY: - plugin->frequency = (float*)data; + plugin->frequency = (const float*)data; break; case TRIANGLE_SLOPE: - plugin->slope = (float*)data; + plugin->slope = (const float*)data; break; case TRIANGLE_OUTPUT: plugin->output = (float*)data; -- cgit v1.2.1