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

@ -344,8 +344,10 @@ int fluid_ladspa_reset(fluid_ladspa_fx_t *fx)
* resulting audio back into the same buffers. * resulting audio back into the same buffers.
* *
* @param fx LADSPA effects instance * @param fx LADSPA effects instance
* @param buf array of pointers into the interleaved left and right audio group buffers * @param left_buf array of pointers into the left audio group buffers
* @param fx_buf array of pointers into the interleaved left and right effects channel 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[], 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[]) 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); LADSPA_API_ENTER(fx);
if (fluid_ladspa_is_active(fx))
{
LADSPA_API_RETURN(fx, FLUID_FAILED);
}
for (i = 0; i < fx->num_plugins; i++) for (i = 0; i < fx->num_plugins; i++)
{ {
if (connect_default_control_nodes(fx, fx->plugins[i]) != FLUID_OK) if (connect_default_control_nodes(fx, fx->plugins[i]) != FLUID_OK)
@ -930,50 +937,57 @@ int fluid_ladspa_check(fluid_ladspa_fx_t *fx, char *err, int err_size)
LADSPA_API_RETURN(fx, FLUID_OK); 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) 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 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;
}
#ifdef WITH_FLOAT
FLUID_MEMCPY(node->buf, buffer, FLUID_BUFSIZE * sizeof(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) 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 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; FLUID_MEMCPY(buffer, node->buf, FLUID_BUFSIZE * sizeof(float));
}
} }
#ifdef WITH_FLOAT #else /* WITH_FLOAT */
FLUID_MEMCPY(buffer, node->buf, FLUID_BUFSIZE * sizeof(float));
#else 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];
}
}
}
static FLUID_INLINE void node_to_buffer(fluid_ladspa_node_t *node, fluid_real_t *buffer)
{
int i;
/* If the node has no inputs, then we don't need to copy it to the node */
if (node->num_inputs > 0)
{
for (i = 0; i < FLUID_BUFSIZE; i++) for (i = 0; i < FLUID_BUFSIZE; i++)
{ {
buffer[i] = (fluid_real_t)node->buf[i]; buffer[i] = (fluid_real_t)node->buf[i];
} }
#endif
} }
}
#endif /* WITH_FLOAT */
static void activate_plugin(fluid_ladspa_plugin_t *plugin) static void activate_plugin(fluid_ladspa_plugin_t *plugin)
{ {

View file

@ -91,8 +91,8 @@ typedef struct _fluid_ladspa_node_t
fluid_ladspa_node_type_t type; fluid_ladspa_node_type_t type;
LADSPA_Data *buf; LADSPA_Data *buf;
char num_inputs; int num_inputs;
char num_outputs; int num_outputs;
} fluid_ladspa_node_t; } fluid_ladspa_node_t;

View file

@ -554,9 +554,7 @@ new_fluid_synth(fluid_settings_t *settings)
fluid_sfloader_t* loader; fluid_sfloader_t* loader;
double gain; double gain;
int i, nbuf; int i, nbuf;
#ifdef LADSPA
int with_ladspa = 0; int with_ladspa = 0;
#endif
/* initialize all the conversion tables and other stuff */ /* initialize all the conversion tables and other stuff */
if (fluid_synth_initialized == 0) 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); fluid_synth_add_default_mod(synth, &default_pitch_bend_mod, FLUID_SYNTH_ADD);
#ifdef LADSPA
/* Create and initialize the Fx unit.*/ /* Create and initialize the Fx unit.*/
fluid_settings_getint(settings, "synth.ladspa.active", &with_ladspa); fluid_settings_getint(settings, "synth.ladspa.active", &with_ladspa);
if (with_ladspa) { if (with_ladspa) {
#ifdef LADSPA
synth->ladspa_fx = new_fluid_ladspa_fx(synth->sample_rate, synth->audio_groups, synth->ladspa_fx = new_fluid_ladspa_fx(synth->sample_rate, synth->audio_groups,
synth->effects_channels, synth->audio_channels); synth->effects_channels, synth->audio_channels);
if(synth->ladspa_fx == NULL) { if(synth->ladspa_fx == NULL) {
@ -719,8 +717,10 @@ new_fluid_synth(fluid_settings_t *settings)
goto error_recovery; goto error_recovery;
} }
fluid_rvoice_mixer_set_ladspa(synth->eventhandler->mixer, synth->ladspa_fx); 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 */ /* allocate and add the default sfont loader */
loader = new_fluid_defsfloader(settings); loader = new_fluid_defsfloader(settings);