ÿþ#include <assert.h> #include <stdlib.h> #include <stdio.h> #include <stdbool.h> #include <math.h> #include <vector> #include <algorithm> #include "reverb.h" #include "Programs.h" #include "ReverbController.h" using namespace ReverbHallRoom; #ifdef __cplusplus extern "C" { #endif ReverbController reverb_ctl; Reverb *reverb_new(int channels, int frame_size, Reverb_common *common, Reverb_taps *taps, Reverb_early *early, Reverb_late *late, Reverb_eq *eq) { int i; Reverb *p = (Reverb *)malloc(sizeof(*p)); assert(p); p->inL = (float *)malloc(frame_size * sizeof(*p->inL)); p->inR = (float *)malloc(frame_size * sizeof(*p->inR)); p->outL = (float *)malloc(frame_size * sizeof(*p->outL)); p->outR = (float *)malloc(frame_size * sizeof(*p->outR)); p->file = fopen("pug.txt", "w"); p->channels = channels; p->frame_size = frame_size; initPrograms(common, taps, early, late, eq); reverb_ctl.SetSamplerate(common->sample_rate); for (i = 0; i < Parameter::COUNT; i++) { reverb_ctl.SetParameter(i, ProgramDarkPlate[i]); } char paramStr[MAX_STR_SIZE]; double* params = reverb_ctl.GetAllParameters(); fprintf(p->file, "FS:%d, CH:%d, N:%d, Reverb Params:\n", common->sample_rate, p->channels, p->frame_size); for (i = 0; i < Parameter::COUNT; ++i) { FormatParameter(params[i], MAX_STR_SIZE, i, paramStr); fprintf(p->file, "%s: %s\n", ParameterLabel[i], paramStr); if (i==9 || i==14 || i==20 || i==32 || i ==40) // 9 14 20 32 40 fprintf(p->file, "\n"); } fclose(p->file); return p; } void reverb_process(Reverb *p, float **in, float **out) { int i, j, k; // std::vector<float> inL(p->frame_size); // std::vector<float> inR(p->frame_size); // std::vector<float> outL(p->frame_size); // std::vector<float> outR(p->frame_size); if (p->channels == 1) { for (i = 0; i < p->frame_size; ++i) { p->inL[i] = in[0][i]; p->inR[i] = in[0][i]; // USðXS Y6R0Ræ]óS } } else { for (i = 0; i < p->frame_size; ++i) { p->inL[i] = in[0][i]; p->inR[i] = in[1][i]; } } // Algorithm reverb_ctl.Process(p->inL, p->inR, p->outL, p->outR, p->frame_size); if (p->channels == 1) { for (i = 0; i < p->frame_size; ++i) { out[0][i] = p->outL[i]; } } else { for (i = 0; i < p->frame_size; ++i) { out[0][i] = p->outL[i]; out[1][i] = p->outR[i]; } } } void reverb_delete(Reverb *p) { free(p->inL); free(p->inR); free(p->outL); free(p->outR); free(p); } void reverb_params_set(Reverb *p) { initPrograms(&p->common, &p->taps, &p->early, &p->late, &p->eq); for (int i = 0; i < Parameter::COUNT; ++i) { reverb_ctl.SetParameter(i, ProgramDarkPlate[i]); } } #ifdef __cplusplus } #endif