Skip to content

Commit

Permalink
chorus: avoid overwriting input buffer when storing samples in the de…
Browse files Browse the repository at this point in the history
…lay line.

In `fluid_rvoice_mixer.c`:`fluid_rvoice_mixer_process_fx()`:

If an audio processing callback is used, `mix_fx_to_out` would be `FALSE`. As a result, `in_ch` and `out_ch_l` points to the same buffer.

In `fluid_chorus.c`:`fluid_chorus_processreplace()`:
```C
        /* process stereo unit */
        /* store the chorus stereo unit d_out to left and right output */
        left_out[sample_index]  = d_out[0] * chorus->wet1  + d_out[1] * chorus->wet2;
        right_out[sample_index] = d_out[1] * chorus->wet1  + d_out[0] * chorus->wet2;

        /* Write the current input sample into the circular buffer */
        push_in_delay_line(chorus, in[sample_index]);
```

Here the chorus processing code writes to the left output buffer (which will overwrite the input buffer in this case) before the sample from the input buffer is stored into the delay buffer, making the chorus output all zeros. If no audio processing callback is used, `mix_fx_to_out` would be `TRUE` and `in` and `left_out` will not point to the same buffer, therefore the order doesn't matter.

Simply swapping the two steps should be a sufficient fix. This patch also apply the same change to `fluid_chorus_processmix` only for the sake of consistency (since they are almost exact copies of each other).

Resolves FluidSynth#751.
  • Loading branch information
chirs241097 authored and jet2jet committed May 27, 2021
1 parent 3d5a684 commit 618fae7
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/rvoice/fluid_chorus.c
Expand Up @@ -980,13 +980,13 @@ void fluid_chorus_processmix(fluid_chorus_t *chorus, const fluid_real_t *in,
d_out[1] += out ;
}

/* Write the current input sample into the circular buffer */
push_in_delay_line(chorus, in[sample_index]);

/* process stereo unit */
/* Add the chorus stereo unit d_out to left and right output */
left_out[sample_index] += d_out[0] * chorus->wet1 + d_out[1] * chorus->wet2;
right_out[sample_index] += d_out[1] * chorus->wet1 + d_out[0] * chorus->wet2;

/* Write the current input sample into the circular buffer */
push_in_delay_line(chorus, in[sample_index]);
}
}

Expand Down Expand Up @@ -1052,12 +1052,12 @@ void fluid_chorus_processreplace(fluid_chorus_t *chorus, const fluid_real_t *in,
d_out[1] += out ;
}

/* Write the current input sample into the circular buffer */
push_in_delay_line(chorus, in[sample_index]);

/* process stereo unit */
/* store the chorus stereo unit d_out to left and right output */
left_out[sample_index] = d_out[0] * chorus->wet1 + d_out[1] * chorus->wet2;
right_out[sample_index] = d_out[1] * chorus->wet1 + d_out[0] * chorus->wet2;

/* Write the current input sample into the circular buffer */
push_in_delay_line(chorus, in[sample_index]);
}
}

0 comments on commit 618fae7

Please sign in to comment.