From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Winamp/benskiQ/benskiQ.cpp | 231 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 Src/Winamp/benskiQ/benskiQ.cpp (limited to 'Src/Winamp/benskiQ/benskiQ.cpp') diff --git a/Src/Winamp/benskiQ/benskiQ.cpp b/Src/Winamp/benskiQ/benskiQ.cpp new file mode 100644 index 00000000..aeaddf0e --- /dev/null +++ b/Src/Winamp/benskiQ/benskiQ.cpp @@ -0,0 +1,231 @@ +#include "main.h" + +#include "EqBand.h" +#include "WinampAttributes.h" + +#include + +extern int filter_srate, filter_enabled, filter_top, filter_top2; +extern float preamp_val; + +static int filter_nch=0; +static bool init=false; +static EqBand benskiQ[10]; +//#define BENSKIQ_Q 0.70710678118654752440084436210485 +#define BENSKIQ_Q 1.41 +static double benskiQ_freqs_iso[10]={31.5, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000}; // ISO standard equalizer frequency table +static double benskiQ_freqs[10]={ 70, 180, 320, 600, 1000, 3000, 6000, 12000, 14000, 16000 }; // winamp style frequency table + +static CRITICAL_SECTION benskiQ_cs; +void benskiQ_init() +{ + InitializeCriticalSection(&benskiQ_cs); + for (int x=0;x<10;x++) + { + benskiQ[x].set_parameters((config_eq_frequencies==EQ_FREQUENCIES_WINAMP)?benskiQ_freqs[x]:benskiQ_freqs_iso[x], 1.0, BENSKIQ_Q); + } +} + + +static __inline double VALTODB(int v) +{ + v -= 31; + if (v < -31) v = -31; + if (v > 32) v = 32; + + if (v > 0) return -12.0*(v / 32.0); + else if (v < 0) + { + return -12.0*(v / 31.0); + } + return 0.0f; +} + +static __inline double VALTOGAIN(int v) +{ + return pow(10.0, VALTODB(v)/20.0); +} + +void benskiQ_eq_set(char data[10]) +{ + if (!init) + { + init=true; benskiQ_init(); + } + EnterCriticalSection(&benskiQ_cs); + for (int x = 0; x < 10; x ++) + { + benskiQ[x].set_parameters((config_eq_frequencies==EQ_FREQUENCIES_WINAMP)?benskiQ_freqs[x]:benskiQ_freqs_iso[x], VALTOGAIN(data[x]), BENSKIQ_Q); + } + LeaveCriticalSection(&benskiQ_cs); +} + +static void FillFloat(float **floatBuf, void *samples, size_t bps, size_t numSamples, size_t numChannels, float preamp) +{ + switch (bps) + { + case 8: + { + preamp /= 256.0f; + unsigned __int8 *samples8 = (unsigned __int8 *)samples; + for (size_t c=0;cUsesOutputPlug&IN_MODULE_FLAG_REPLAYGAIN) && config_replaygain.GetBool()) + return pow(10.0f, (float)config_replaygain_non_rg_gain/20.0f); + else + return 1.0f; +} + +static float ReplayGainPreamp() +{ + if (!(in_mod->UsesOutputPlug&IN_MODULE_FLAG_REPLAYGAIN_PREAMP) && config_replaygain.GetBool()) + return pow(10.0f, (float)config_replaygain_preamp/20.0f); + else + return 1.0f; +} + +int benskiQ_eq_dosamples(short *samples, int numsamples, int bps, int nch, int srate) +{ + if (filter_enabled && in_mod && !(in_mod->UsesOutputPlug&IN_MODULE_FLAG_EQ) && bps != 32) + { + if (srate !=filter_srate || nch != filter_nch) + benskiQ_reset(srate, nch); + + if (!init) + { + init=true; benskiQ_init(); + } + float **in = MakeSample(numsamples, nch); + + FillFloat(in, samples, bps, numsamples, nch, preamp_val*NonReplayGainAdjust()*ReplayGainPreamp()); + EnterCriticalSection(&benskiQ_cs); + for (int x = 0; x < filter_top; x ++) + { + benskiQ[x].process(in, in, numsamples, nch); + } + LeaveCriticalSection(&benskiQ_cs); + FillSamples(samples, in, bps, numsamples, nch); + } + else if (!(in_mod->UsesOutputPlug&IN_MODULE_FLAG_REPLAYGAIN) && config_replaygain.GetBool() && (config_replaygain_non_rg_gain.GetFloat() != 0) && bps != 32) + { + float **in = MakeSample(numsamples, nch); + FillFloat(in, samples, bps, numsamples, nch, NonReplayGainAdjust()*ReplayGainPreamp()); + FillSamples(samples, in, bps, numsamples, nch); + } + else if (!(in_mod->UsesOutputPlug&IN_MODULE_FLAG_REPLAYGAIN_PREAMP) && config_replaygain.GetBool() && (config_replaygain_preamp.GetFloat() != 0) && bps != 32) + { + float **in = MakeSample(numsamples, nch); + FillFloat(in, samples, bps, numsamples, nch, ReplayGainPreamp()); + FillSamples(samples, in, bps, numsamples, nch); + } + else + filter_srate = 0; + return dsp_dosamples(samples, numsamples, bps, nch, srate); +} -- cgit