Merge pull request #242 from mawe42/ladspa-additional-fixes

More fixes to LADSPA system
This commit is contained in:
Marcus Weseloh 2017-10-22 11:38:37 +02:00 committed by GitHub
commit 799f3ea44c
3 changed files with 53 additions and 39 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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);