diff --git a/src/bindings/fluid_ladspa.c b/src/bindings/fluid_ladspa.c index efef7286..9bbe5d81 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 */ @@ -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[]) @@ -812,6 +814,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) @@ -930,51 +937,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) @@ -1087,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. * @@ -1144,7 +1158,7 @@ static void delete_fluid_ladspa_plugin(fluid_ladspa_plugin_t *plugin) { return; } - + if (plugin->ports != NULL) { FLUID_FREE(plugin->ports); 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; diff --git a/src/synth/fluid_synth.c b/src/synth/fluid_synth.c index 24ca098c..2273d2ae 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);