diff options
Diffstat (limited to 'src/adenv.c')
-rw-r--r-- | src/adenv.c | 250 |
1 files changed, 63 insertions, 187 deletions
diff --git a/src/adenv.c b/src/adenv.c index 1c75688..81b54f4 100644 --- a/src/adenv.c +++ b/src/adenv.c @@ -1,5 +1,5 @@ /* - adenv.c - A LADSPA plugin to generate percussive (i.e no sustain time), linear AD envelopes. + adenv.c - A LV2 plugin to generate percussive (i.e no sustain time), linear AD envelopes. Copyright 2005 Loki Davison based on ADENV by Mike Rawes @@ -21,20 +21,11 @@ #define _XOPEN_SOURCE 500 /* strdup */ #include <stdlib.h> -#include <ladspa.h> +#include <lv2/lv2plug.in/ns/lv2core/lv2.h> #include <stdio.h> #include <math.h> -#ifdef ENABLE_NLS -# include <locale.h> -# define G_(s) gettext(s) -#else -# define G_(s) (s) -#endif -#define G_NOP(s) s - #define ADENV_BASE_ID 2661 -#define ADENV_VARIANT_COUNT 1 #define ADENV_GATE 0 #define ADENV_TRIGGER 1 @@ -42,7 +33,7 @@ #define ADENV_DECAY 3 #define ADENV_OUTPUT 4 -LADSPA_Descriptor **dahdsr_descriptors = 0; +LV2_Descriptor **dahdsr_descriptors = 0; typedef enum { IDLE, @@ -51,39 +42,31 @@ typedef enum { } ADENVState; typedef struct { - LADSPA_Data *gate; - LADSPA_Data *trigger; - LADSPA_Data *attack; - LADSPA_Data *decay; - LADSPA_Data *output; - LADSPA_Data srate; - LADSPA_Data inv_srate; - LADSPA_Data last_gate; - LADSPA_Data last_trigger; - LADSPA_Data from_level; - LADSPA_Data level; + float *gate; + float *trigger; + float *attack; + float *decay; + float *output; + float srate; + float inv_srate; + float last_gate; + float last_trigger; + float from_level; + float level; ADENVState state; unsigned long samples; } Dahdsr; -const LADSPA_Descriptor * -ladspa_descriptor(unsigned long index) -{ - if (index < ADENV_VARIANT_COUNT) - return dahdsr_descriptors[index]; - - return 0; -} - -void -cleanupDahdsr(LADSPA_Handle instance) +static void +cleanup(LV2_Handle instance) { free(instance); } -void -connectPortDahdsr(LADSPA_Handle instance, - unsigned long port, LADSPA_Data * data) +static void +connect_port(LV2_Handle instance, + uint32_t port, + void* data) { Dahdsr *plugin = (Dahdsr *) instance; @@ -106,20 +89,22 @@ connectPortDahdsr(LADSPA_Handle instance, } } -LADSPA_Handle -instantiateDahdsr(const LADSPA_Descriptor * descriptor, - unsigned long sample_rate) +static LV2_Handle +instantiate(const LV2_Descriptor* descriptor, + double sample_rate, + const char* bundle_path, + const LV2_Feature* const* features) { Dahdsr *plugin = (Dahdsr *) malloc(sizeof(Dahdsr)); - plugin->srate = (LADSPA_Data) sample_rate; + plugin->srate = (float) sample_rate; plugin->inv_srate = 1.0f / plugin->srate; - return (LADSPA_Handle) plugin; + return (LV2_Handle) plugin; } -void -activateDahdsr(LADSPA_Handle instance) +static void +activate(LV2_Handle instance) { Dahdsr *plugin = (Dahdsr *) instance; @@ -131,38 +116,38 @@ activateDahdsr(LADSPA_Handle instance) plugin->samples = 0; } -void -runDahdsr_Control(LADSPA_Handle instance, unsigned long sample_count) +static void +run(LV2_Handle instance, uint32_t sample_count) { Dahdsr *plugin = (Dahdsr *) instance; /* Gate */ - LADSPA_Data *gate = plugin->gate; + float *gate = plugin->gate; /* Trigger */ - LADSPA_Data *trigger = plugin->trigger; + float *trigger = plugin->trigger; /* Attack Time (s) */ - LADSPA_Data attack = *(plugin->attack); + float attack = *(plugin->attack); /* Decay Time (s) */ - LADSPA_Data decay = *(plugin->decay); + float decay = *(plugin->decay); /* Envelope Out */ - LADSPA_Data *output = plugin->output; + float *output = plugin->output; /* Instance Data */ - LADSPA_Data srate = plugin->srate; - LADSPA_Data inv_srate = plugin->inv_srate; - LADSPA_Data last_gate = plugin->last_gate; - LADSPA_Data last_trigger = plugin->last_trigger; - LADSPA_Data from_level = plugin->from_level; - LADSPA_Data level = plugin->level; + float srate = plugin->srate; + float inv_srate = plugin->inv_srate; + float last_gate = plugin->last_gate; + float last_trigger = plugin->last_trigger; + float from_level = plugin->from_level; + float level = plugin->level; ADENVState state = plugin->state; unsigned long samples = plugin->samples; - LADSPA_Data gat, trg, att, dec; - LADSPA_Data elapsed; + float gat, trg, att, dec; + float elapsed; unsigned long s; /* Convert times into rates */ @@ -174,7 +159,7 @@ runDahdsr_Control(LADSPA_Handle instance, unsigned long sample_count) * while (currentSample < endSample) Level += Level * ReleaseCoeff; */ - LADSPA_Data ReleaseCoeff = log(0.001) / (decay * srate); + float ReleaseCoeff = log(0.001) / (decay * srate); for (s = 0; s < sample_count; s++) { gat = gate[s]; @@ -201,7 +186,7 @@ runDahdsr_Control(LADSPA_Handle instance, unsigned long sample_count) break; case ATTACK: samples++; - elapsed = (LADSPA_Data) samples *att; + elapsed = (float) samples *att; if (elapsed > 1.0f) { state = DECAY; @@ -213,7 +198,7 @@ runDahdsr_Control(LADSPA_Handle instance, unsigned long sample_count) break; case DECAY: samples++; - elapsed = (LADSPA_Data) samples *dec; + elapsed = (float) samples *dec; if (elapsed > 1.0f) { state = IDLE; @@ -244,131 +229,22 @@ runDahdsr_Control(LADSPA_Handle instance, unsigned long sample_count) plugin->samples = samples; } -void -_init(void) -{ - static const unsigned long ids[] = { ADENV_BASE_ID }; - static const char *labels[] = { "adenv" }; - static const char *names[] = { G_NOP("Percussive AD Envelope") }; - char **port_names; - LADSPA_PortDescriptor *port_descriptors; - LADSPA_PortRangeHint *port_range_hints; - LADSPA_Descriptor *descriptor; - - LADSPA_PortDescriptor gate_port_descriptors[] = - { LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO }; - LADSPA_PortDescriptor trigger_port_descriptors[] = - { LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO }; - LADSPA_PortDescriptor attack_port_descriptors[] = - { LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL }; - LADSPA_PortDescriptor decay_port_descriptors[] = - { LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL }; - LADSPA_PortDescriptor output_port_descriptors[] = - { LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO }; - - void (*run_functions[]) (LADSPA_Handle, unsigned long) = { - runDahdsr_Control}; - -#ifdef ENABLE_NLS - setlocale(LC_ALL, ""); - bindtextdomain(PACKAGE, LOCALEDIR); - textdomain(PACKAGE); -#endif - - dahdsr_descriptors = - (LADSPA_Descriptor **) calloc(ADENV_VARIANT_COUNT, - sizeof(LADSPA_Descriptor)); - - if (dahdsr_descriptors) { - int i = 0; - - dahdsr_descriptors[i] = - (LADSPA_Descriptor *) malloc(sizeof(LADSPA_Descriptor)); - descriptor = dahdsr_descriptors[i]; - if (descriptor) { - descriptor->UniqueID = ids[i]; - descriptor->Label = labels[i]; - descriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE; - descriptor->Name = G_(names[i]); - descriptor->Maker = - "Loki Davison <ltdav1[at]student.monash.edu.au>"; - descriptor->Copyright = "GPL"; - - descriptor->PortCount = 5; - - port_descriptors = - (LADSPA_PortDescriptor *) calloc(5, - sizeof - (LADSPA_PortDescriptor)); - descriptor->PortDescriptors = - (const LADSPA_PortDescriptor *)port_descriptors; - - port_range_hints = - (LADSPA_PortRangeHint *) calloc(5, - sizeof(LADSPA_PortRangeHint)); - descriptor->PortRangeHints = - (const LADSPA_PortRangeHint *)port_range_hints; - - port_names = (char **)calloc(5, sizeof(char *)); - descriptor->PortNames = (const char **)port_names; - - /* Parameters for Gate */ - port_descriptors[ADENV_GATE] = gate_port_descriptors[i]; - port_names[ADENV_GATE] = G_("Gate"); - port_range_hints[ADENV_GATE].HintDescriptor = - LADSPA_HINT_TOGGLED; - - /* Parameters for Trigger */ - port_descriptors[ADENV_TRIGGER] = trigger_port_descriptors[i]; - port_names[ADENV_TRIGGER] = G_("Trigger"); - port_range_hints[ADENV_TRIGGER].HintDescriptor = - LADSPA_HINT_TOGGLED; - - /* Parameters for Attack Time (s) */ - port_descriptors[ADENV_ATTACK] = attack_port_descriptors[i]; - port_names[ADENV_ATTACK] = G_("Attack Time (s)"); - port_range_hints[ADENV_ATTACK].HintDescriptor = - LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_MINIMUM; - port_range_hints[ADENV_ATTACK].LowerBound = 0.0f; - - /* Parameters for Decay Time (s) */ - port_descriptors[ADENV_DECAY] = decay_port_descriptors[i]; - port_names[ADENV_DECAY] = G_("Decay Time (s)"); - port_range_hints[ADENV_DECAY].HintDescriptor = - LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_MINIMUM; - port_range_hints[ADENV_DECAY].LowerBound = 0.0f; - - /* Parameters for Envelope Out */ - port_descriptors[ADENV_OUTPUT] = output_port_descriptors[i]; - port_names[ADENV_OUTPUT] = G_("Envelope Out"); - port_range_hints[ADENV_OUTPUT].HintDescriptor = 0; - - descriptor->activate = activateDahdsr; - descriptor->cleanup = cleanupDahdsr; - descriptor->connect_port = connectPortDahdsr; - descriptor->deactivate = NULL; - descriptor->instantiate = instantiateDahdsr; - descriptor->run = run_functions[i]; - descriptor->run_adding = NULL; - descriptor->set_run_adding_gain = NULL; - } - } - -} - -void -_fini(void) +static const LV2_Descriptor descriptor = { + "http://drobilla.net/plugins/omins/adenv", + instantiate, + connect_port, + activate, + run, + NULL, + cleanup, + NULL, +}; + +LV2_SYMBOL_EXPORT const LV2_Descriptor* +lv2_descriptor(uint32_t index) { - LADSPA_Descriptor *descriptor; - - if (dahdsr_descriptors) { - descriptor = dahdsr_descriptors[0]; - if (descriptor) { - free((LADSPA_PortDescriptor *) descriptor->PortDescriptors); - free((char **)descriptor->PortNames); - free((LADSPA_PortRangeHint *) descriptor->PortRangeHints); - free(descriptor); - } - free(dahdsr_descriptors); + switch (index) { + case 0: return &descriptor; + default: return NULL; } } |