chenlh
2026-03-13 7fb0a76018188615b3cde4f83ce07935a5290834
cbb_RoomReverb/reverb_wrapper.c
@@ -1,17 +1,130 @@
#include "reverb.h"
//#include "reverb_wrapper.h"
#include "reverb_wrapper.h"
#include <stdio.h>
static int ch,n,L;
static float *x[32], *y[32];
#if (GUI == UI_XYK)
   Reverb_common c_t;
   Reverb_taps t_t;
   Reverb_early e_t;
   Reverb_late l_t;
   Reverb_eq eq_t;
   void params_chg(Reverb_common *com, Reverb_taps *tap, Reverb_early *ear, Reverb_late *lat, Reverb_eq *eq, ReverbUI *ui)
   {
      com->dry = 1 - ui->wetdry_ratio / 100;
      com->early = ui->wetdry_ratio / 100;
      com->late = ui->wetdry_ratio / 100;
      com->input_mix_on = 0;
      com->input_mix = 0;
      com->high_cut_on = 0;
      com->high_cut = 0;
      com->low_cut_on = 0;
      com->low_cut = 0;
      com->cross_seed = 0;
      tap->multi_taps_on = 1;
      tap->taps_count = ui->density / 10.0f;
      tap->taps_delay = ui->pre_delay / 200.0f;
      tap->taps_decay = ui->reverb_time / 20.0f;
      tap->taps_length = ui->reverb_time / 20.0f;
      ear->early_difus_on = 1;
      ear->early_count = ui->density / 10.0f;
      ear->early_delay = ui->pre_delay / 200.0f;
      ear->early_feedback = 0.5;
      ear->early_mod_amt = ui->diffusion / 10.0f;
      ear->early_mod_rate = ui->diffusion / 10.0f;
      lat->late_mode = 1;
      lat->late_reflect_on = 1;
      lat->line_count = ui->density / 10.0f;
      lat->line_size = ui->reverb_time / 20.0f;
      lat->line_mod_amt = ui->diffusion / 10.0f;
      lat->line_mod_rate = ui->reverb_time / 20.0f;
      lat->difus_count = ui->density / 10.0f;
      lat->difus_delay = ui->pre_delay / 200.0f;
      lat->difus_feedback = ui->reverb_time / 20.0f;
      lat->difus_mod_amt = ui->diffusion / 10.0f;
      lat->difus_mod_rate = ui->diffusion / 10.0f;
      eq->low_shelf_on = 0;
      eq->high_shelf_on = 0;
      eq->low_pass_on = 0;
      eq->low_shelf_freq = 0;
      eq->low_shelf_gain = 0;
      eq->high_shelf_freq = 0;
      eq->high_shelf_gain = 0;
      eq->low_pass_freq = 0;
   }
   void reverb_wrapper_init(void **p, int channels, int frame_size, int sample_rate, double room_size, double wetdry_ratio, double reverb_time, double pre_delay,
                          double high_damp_freq, double high_ratio, double diffusion, double density, double hpf, double lpf
                          )
   {
      ReverbUI ui = {room_size, wetdry_ratio, reverb_time, pre_delay, high_damp_freq, high_ratio, diffusion, density, hpf, lpf};
      c_t.sample_rate = sample_rate;
      params_chg(&c_t, &t_t, &e_t, &l_t, &eq_t, &ui);
      *(Reverb **)p = reverb_new(channels, frame_size, &c_t, &t_t, &e_t, &l_t, &eq_t);
      ch = channels;
      n = frame_size;
//      FILE *file = fopen("debug.txt", "w");
//      if (NULL == file) return;
//
//      fprintf(file, "GUI params:\n");
//      fprintf(file, "late_refl_on:%d.\n", l_t.late_reflect_on);
//      fprintf(file, "FS:%d  dry:%2.2f  early:%2.2f  late:%2.2f  inp_on:%d  h_c_on:%d  l_c_on:%d  in_mix:%2.2f  h_c:%2.2f  l_c:%2.2f  c_s:%2.2f.\n",
//                  c_t.sample_rate, c_t.dry, c_t.early, c_t.late, c_t.input_mix_on, c_t.high_cut_on, \
//                  c_t.low_cut_on, c_t.input_mix, c_t.high_cut, c_t.low_cut, c_t.cross_seed);
//      fclose(file);
   }
   void reverb_wrapper_process(void *p, int sample_rate, double room_size, double wetdry_ratio, double reverb_time, double pre_delay,
                          double high_damp_freq, double high_ratio, double diffusion, double density, double hpf, double lpf,
                          float *src, float *dst)
   {
      int i;
      for(i = 0; i < ch; i ++)
         x[i] = src + i * n;
      for(i = 0; i < ch; i ++)
         y[i] = dst + i * n;
      reverb_process(p, x, y);
      ReverbUI uip = {room_size, wetdry_ratio, reverb_time, pre_delay, high_damp_freq, high_ratio, diffusion, density, hpf, lpf};
      params_chg(&c_t, &t_t, &e_t, &l_t, &eq_t, &uip);
      Reverb params = {ch, n, {sample_rate, c_t.dry, c_t.early, c_t.late, c_t.input_mix_on, c_t.high_cut_on, c_t.low_cut_on, c_t.input_mix, c_t.high_cut, c_t.low_cut, c_t.cross_seed},
                {t_t.multi_taps_on, t_t.taps_count, t_t.taps_delay, t_t.taps_decay, t_t.taps_length},
                  {e_t.early_difus_on, e_t.early_count, e_t.early_delay, e_t.early_feedback, e_t.early_mod_amt, e_t.early_mod_rate},
                {l_t.late_mode, l_t.late_reflect_on, l_t.line_count, l_t.line_size, l_t.line_mod_amt, l_t.line_mod_rate},
                {eq_t.low_shelf_on, eq_t.high_shelf_on, eq_t.low_pass_on, eq_t.low_shelf_freq, eq_t.low_shelf_gain, eq_t.high_shelf_freq, eq_t.high_shelf_gain, eq_t.low_pass_freq},
               };
      reverb_params_set(&params);
   }
#else
void reverb_wrapper_init(void **p, int channels, int frame_size, int sample_rate, double dry, double early, double late, int input_mix_on, int hight_cut_on,   // 6
   int low_cut_on, double input_mix, double high_cut_freq, double low_cut_freq, double cross_seed, int taps_on, double  taps_count, double taps_pre_delay, double taps_decay, double taps_length, int early_difus_on, double early_difus_count, double early_difus_delay,   // 13
   double early_difus_feedback, double early_difus_mod_amt, double early_difus_mod_rate, int late_mode, int late_reflect_on, double late_line_count, double late_line_size, double late_line_mod_amt, double late_line_decay, double late_line_mod_rate, double late_difus_count, double late_difus_delay,   // 12
   double late_difus_feedback, double late_difus_mod_amt, double late_difus_mod_rate, int eq_low_shelf_on, int eq_high_shelf_on, int eq_low_pass_on, double eq_low_shelf_freq, double eq_low_shelf_gain, double eq_high_shelf_freq, double eq_high_shelf_gain, double eq_low_pass_freq      // 11
    )
      int low_cut_on, double input_mix, double high_cut_freq, double low_cut_freq, double cross_seed, int taps_on, double  taps_count, double taps_pre_delay, double taps_decay, double taps_length, int early_difus_on, double early_difus_count, double early_difus_delay,   // 13
      double early_difus_feedback, double early_difus_mod_amt, double early_difus_mod_rate, int late_mode, int late_reflect_on, double late_line_count, double late_line_size, double late_line_mod_amt, double late_line_decay, double late_line_mod_rate, double late_difus_count, double late_difus_delay,   // 12
      double late_difus_feedback, double late_difus_mod_amt, double late_difus_mod_rate, int eq_low_shelf_on, int eq_high_shelf_on, int eq_low_pass_on, double eq_low_shelf_freq, double eq_low_shelf_gain, double eq_high_shelf_freq, double eq_high_shelf_gain, double eq_low_pass_freq      // 11
       )
{
   Reverb_common c_t = {sample_rate, dry, early, late, input_mix_on, hight_cut_on, low_cut_on, input_mix, high_cut_freq, low_cut_freq, cross_seed};
   Reverb_taps t_t = {taps_on, taps_count, taps_pre_delay, taps_decay, taps_length};
@@ -23,23 +136,21 @@
   ch = channels;
   n = frame_size;
//   FILE *file = fopen("debug.txt", "w");
//   FILE *file = fopen("second.txt", "w");
//   if (NULL == file) return;
//
//   fprintf(file, "GUI params:\n");
//   fprintf(file, "late_refl_on:%d.\n", l_t.late_reflect_on);
//   fprintf(file, "FS:%d  dry:%2.2f  early:%2.2f  late:%2.2f  inp_on:%d  h_c_on:%d  l_c_on:%d  in_mix:%2.2f  h_c:%2.2f  l_c:%2.2f  c_s:%2.2f.\n",
//               c_t.sample_rate, c_t.dry, c_t.early, c_t.late, c_t.input_mix_on, c_t.high_cut_on, \
//               c_t.low_cut_on, c_t.input_mix, c_t.high_cut, c_t.low_cut, c_t.cross_seed);
//   fprintf(file, "difus_on:%d  count:%2.4f  delay:%2.4f  feedback:%2.4f  mod_amt:%2.4f  mod_rate:%2.4f .\n",
//               e_t.early_difus_on, e_t.early_count, e_t.early_delay, e_t.early_feedback, e_t.early_mod_amt, e_t.early_mod_rate);
//   fclose(file);
}
void reverb_wrapper_process(void *p, /*int sample_rate, double dry, double early, double late, int input_mix_on, int hight_cut_on,   // 6
void reverb_wrapper_process(void *p, int sample_rate, double dry, double early, double late, int input_mix_on, int hight_cut_on,   // 6
   int low_cut_on, double input_mix, double high_cut_freq, double low_cut_freq, double cross_seed, int taps_on, double  taps_count, double taps_pre_delay, double taps_decay, double taps_length, int early_difus_on, double early_difus_count, double early_difus_delay,   // 13
   double early_difus_feedback, double early_difus_mod_amt, double early_difus_mod_rate, int late_mode, int late_reflect_on, double late_line_count, double late_line_size, double late_line_mod_amt, double late_line_decay, double late_line_mod_rate, double late_difus_count, double late_difus_delay,   // 12
   double late_difus_feedback, double late_difus_mod_amt, double late_difus_mod_rate, int eq_low_shelf_on, int eq_high_shelf_on, int eq_low_pass_on, double eq_low_shelf_freq, double eq_low_shelf_gain, double eq_high_shelf_freq, double eq_high_shelf_gain, double eq_low_pass_freq,
                          */float *src, float *dst)
   float *src, float *dst)
{
   int i;
@@ -52,17 +163,23 @@
   reverb_process(p, x, y);
   /*Reverb params = {ch, n, {sample_rate, dry, early, late, input_mix_on, hight_cut_on, low_cut_on, input_mix, high_cut_freq, low_cut_freq, cross_seed},
   Reverb params = {ch, n, {sample_rate, dry, early, late, input_mix_on, hight_cut_on, low_cut_on, input_mix, high_cut_freq, low_cut_freq, cross_seed},
                {taps_on, taps_count, taps_pre_delay, taps_decay, taps_length},
                  {early_difus_on, early_difus_count, early_difus_delay, early_difus_feedback, early_difus_mod_amt, early_difus_mod_rate},
                {late_mode, late_reflect_on, late_line_count, late_line_size, late_line_mod_amt, late_line_mod_rate},
                {eq_low_shelf_on, eq_high_shelf_on, eq_low_pass_on, eq_low_shelf_freq, eq_low_shelf_gain, eq_high_shelf_freq, eq_high_shelf_gain, eq_low_pass_freq},
               };
   reverb_params_set(&params);*/
   reverb_params_set(&params);
   
}
#endif
void reverb_wrapper_delete(void *p)
{
    reverb_delete(p);