From 3cc684e47eb5a394c23d6dab56116201cdf47075 Mon Sep 17 00:00:00 2001 From: Marcus Weseloh Date: Sat, 21 Oct 2017 22:36:34 +0200 Subject: [PATCH 1/6] Avoid a few ifdefs by defining two separate sets of node<->buffer functions --- src/bindings/fluid_ladspa.c | 63 ++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/src/bindings/fluid_ladspa.c b/src/bindings/fluid_ladspa.c index 7d62f925..bca44039 100644 --- a/src/bindings/fluid_ladspa.c +++ b/src/bindings/fluid_ladspa.c @@ -930,51 +930,58 @@ int fluid_ladspa_check(fluid_ladspa_fx_t *fx, char *err, int err_size) LADSPA_API_RETURN(fx, FLUID_OK); } +#ifdef WITH_FLOAT static FLUID_INLINE void buffer_to_node(fluid_real_t *buffer, fluid_ladspa_node_t *node) { -#ifndef WITH_FLOAT - int i; -#endif - /* If the node is not used by any plugin, then we don't need to fill it */ - if (node->num_outputs == 0) + if (node->num_outputs > 0) { - return; + FLUID_MEMCPY(node->buf, buffer, FLUID_BUFSIZE * sizeof(float)); + } +} + +static FLUID_INLINE void node_to_buffer(fluid_ladspa_node_t *node, fluid_real_t *buffer) +{ + /* If the node has no inputs, then we don't need to copy it to the node */ + if (node->num_inputs > 0) + { + FLUID_MEMCPY(buffer, node->buf, FLUID_BUFSIZE * sizeof(float)); + } +} + +#else /* WITH_FLOAT */ + +static FLUID_INLINE void buffer_to_node(fluid_real_t *buffer, fluid_ladspa_node_t *node) +{ + int i; + + /* If the node is not used by any plugin, then we don't need to fill it */ + if (node->num_outputs > 0) + { + for (i = 0; i < FLUID_BUFSIZE; i++) + { + node->buf[i] = (LADSPA_Data)buffer[i]; + } } - -#ifdef WITH_FLOAT - FLUID_MEMCPY(node->buf, buffer, FLUID_BUFSIZE * sizeof(float)); -#else - for (i = 0; i < FLUID_BUFSIZE; i++) - { - node->buf[i] = (LADSPA_Data)buffer[i]; - } -#endif } static FLUID_INLINE void node_to_buffer(fluid_ladspa_node_t *node, fluid_real_t *buffer) { -#ifndef WITH_FLOAT int i; -#endif /* If the node has no inputs, then we don't need to copy it to the node */ - if (node->num_inputs == 0) + if (node->num_inputs > 0) { - return; + for (i = 0; i < FLUID_BUFSIZE; i++) + { + buffer[i] = (fluid_real_t)node->buf[i]; + } } - -#ifdef WITH_FLOAT - FLUID_MEMCPY(buffer, node->buf, FLUID_BUFSIZE * sizeof(float)); -#else - for (i = 0; i < FLUID_BUFSIZE; i++) - { - buffer[i] = (fluid_real_t)node->buf[i]; - } -#endif } +#endif /* WITH_FLOAT */ + static void activate_plugin(fluid_ladspa_plugin_t *plugin) { if (!plugin->active) From 8aa2d1447665ceb37248d699a46089829e234981 Mon Sep 17 00:00:00 2001 From: Marcus Weseloh Date: Sat, 21 Oct 2017 22:40:19 +0200 Subject: [PATCH 2/6] Nicer error message when user requests LADSPA but is not available. --- src/synth/fluid_synth.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/synth/fluid_synth.c b/src/synth/fluid_synth.c index 84fc31e0..e59f2341 100644 --- a/src/synth/fluid_synth.c +++ b/src/synth/fluid_synth.c @@ -554,9 +554,7 @@ new_fluid_synth(fluid_settings_t *settings) fluid_sfloader_t* loader; double gain; int i, nbuf; -#ifdef LADSPA int with_ladspa = 0; -#endif /* initialize all the conversion tables and other stuff */ if (fluid_synth_initialized == 0) @@ -708,10 +706,10 @@ new_fluid_synth(fluid_settings_t *settings) fluid_synth_add_default_mod(synth, &default_pitch_bend_mod, FLUID_SYNTH_ADD); -#ifdef LADSPA /* Create and initialize the Fx unit.*/ fluid_settings_getint(settings, "synth.ladspa.active", &with_ladspa); if (with_ladspa) { +#ifdef LADSPA synth->ladspa_fx = new_fluid_ladspa_fx(synth->sample_rate, synth->audio_groups, synth->effects_channels, synth->audio_channels); if(synth->ladspa_fx == NULL) { @@ -719,8 +717,10 @@ new_fluid_synth(fluid_settings_t *settings) goto error_recovery; } fluid_rvoice_mixer_set_ladspa(synth->eventhandler->mixer, synth->ladspa_fx); +#else /* LADSPA */ + FLUID_LOG(FLUID_WARN, "FluidSynth has not been compiled with LADSPA support"); +#endif /* LADSPA */ } -#endif /* allocate and add the default sfont loader */ loader = new_fluid_defsfloader(settings); From 29a4abb9a5a6ef817f12eecbae571044e6a6b1c1 Mon Sep 17 00:00:00 2001 From: Marcus Weseloh Date: Sat, 21 Oct 2017 22:45:31 +0200 Subject: [PATCH 3/6] Use int for number of inputs and outputs, some plugins have a lot of ports --- src/bindings/fluid_ladspa.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bindings/fluid_ladspa.h b/src/bindings/fluid_ladspa.h index e4d8950c..21ed6fd2 100644 --- a/src/bindings/fluid_ladspa.h +++ b/src/bindings/fluid_ladspa.h @@ -91,8 +91,8 @@ typedef struct _fluid_ladspa_node_t fluid_ladspa_node_type_t type; LADSPA_Data *buf; - char num_inputs; - char num_outputs; + int num_inputs; + int num_outputs; } fluid_ladspa_node_t; From 47d640571b6624a610692d69769da5eab2a77ea9 Mon Sep 17 00:00:00 2001 From: Marcus Weseloh Date: Sun, 22 Oct 2017 11:23:04 +0200 Subject: [PATCH 4/6] Add missing check for ladspa_is_active to ladsap_control_defaults --- src/bindings/fluid_ladspa.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/bindings/fluid_ladspa.c b/src/bindings/fluid_ladspa.c index bca44039..c3e34caa 100644 --- a/src/bindings/fluid_ladspa.c +++ b/src/bindings/fluid_ladspa.c @@ -812,6 +812,11 @@ int fluid_ladspa_control_defaults(fluid_ladspa_fx_t *fx) LADSPA_API_ENTER(fx); + if (fluid_ladspa_is_active(fx)) + { + LADSPA_API_RETURN(fx, FLUID_FAILED); + } + for (i = 0; i < fx->num_plugins; i++) { if (connect_default_control_nodes(fx, fx->plugins[i]) != FLUID_OK) From e0dcdbcdfc0aa8aec445ca20c25f855b5f4db884 Mon Sep 17 00:00:00 2001 From: Marcus Weseloh Date: Sat, 21 Oct 2017 23:11:09 +0200 Subject: [PATCH 5/6] Correct documentation for fluid_ladspa_run --- src/bindings/fluid_ladspa.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/bindings/fluid_ladspa.c b/src/bindings/fluid_ladspa.c index c3e34caa..b6bbeb6a 100644 --- a/src/bindings/fluid_ladspa.c +++ b/src/bindings/fluid_ladspa.c @@ -344,8 +344,10 @@ int fluid_ladspa_reset(fluid_ladspa_fx_t *fx) * resulting audio back into the same buffers. * * @param fx LADSPA effects instance - * @param buf array of pointers into the interleaved left and right audio group buffers - * @param fx_buf array of pointers into the interleaved left and right effects channel buffers + * @param left_buf array of pointers into the left audio group buffers + * @param right_buf array of pointers into the right audio group buffers + * @param fx_left_buf array of pointers into the left effects buffers + * @param fx_right_buf array of pointers into the right effects buffers */ void fluid_ladspa_run(fluid_ladspa_fx_t *fx, fluid_real_t *left_buf[], fluid_real_t *right_buf[], fluid_real_t *fx_left_buf[], fluid_real_t *fx_right_buf[]) From e18e54d7aeac922abec6f9c2eb5802e40a47731f Mon Sep 17 00:00:00 2001 From: Marcus Weseloh Date: Sat, 21 Oct 2017 22:43:48 +0200 Subject: [PATCH 6/6] White-space --- src/bindings/fluid_ladspa.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bindings/fluid_ladspa.c b/src/bindings/fluid_ladspa.c index b6bbeb6a..f45309c2 100644 --- a/src/bindings/fluid_ladspa.c +++ b/src/bindings/fluid_ladspa.c @@ -20,7 +20,7 @@ /* This module: 3/2002 * Author: Markus Nentwig, nentwig@users.sourceforge.net - * + * * Complete rewrite: 10/2017 * Author: Marcus Weseloh */ @@ -1101,7 +1101,7 @@ static const LADSPA_Descriptor *get_plugin_descriptor(const fluid_ladspa_lib_t * } } -/** +/** * Instantiate a new LADSPA plugin from a library and set up the associated * control structures needed by the LADSPA fx engine. * @@ -1158,7 +1158,7 @@ static void delete_fluid_ladspa_plugin(fluid_ladspa_plugin_t *plugin) { return; } - + if (plugin->ports != NULL) { FLUID_FREE(plugin->ports);