From 618fae7035b3aa9376bd69cb5364d7d32a78cf78 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Sat, 23 Jan 2021 16:59:21 +0800 Subject: [PATCH] chorus: avoid overwriting input buffer when storing samples in the delay 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 #751. --- src/rvoice/fluid_chorus.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/rvoice/fluid_chorus.c b/src/rvoice/fluid_chorus.c index ae5cc4aea..8f8b3c004 100644 --- a/src/rvoice/fluid_chorus.c +++ b/src/rvoice/fluid_chorus.c @@ -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]); } } @@ -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]); } }