mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-11-30 22:27:16 +01:00
176 lines
4.2 KiB
C
176 lines
4.2 KiB
C
/*****************************************
|
|
|
|
EQ10 library version 1.0
|
|
Copyright (C)2002 4Front Technologies
|
|
Written by George Yohng
|
|
|
|
http://www.opensound.com
|
|
|
|
Proprietary software.
|
|
|
|
*****************************************/
|
|
|
|
|
|
#ifndef EQ10DSP_H_INCLUDED
|
|
#define EQ10DSP_H_INCLUDED
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* used for volume detectors. for instance, if you want to plot
|
|
frequency response, you can use "detect" variable of needed
|
|
subband to query level of that frequency band.
|
|
|
|
release time - is the time in seconds in which detector falls back
|
|
to zero, if no peaks detected */
|
|
|
|
|
|
// #define EQ10_DETECTOR_CODE /* uncomment this to */
|
|
// #define EQ10_DETECTOR_RELEASE 1.0f /* enable band detector */
|
|
|
|
|
|
/* Dynamic limiter, which prevents EQ from distortion. In no case you
|
|
can overflow EQ and cause it to clip */
|
|
|
|
#define EQ10_TRIM_CODE 0.930 /* trim at -0.6dB */
|
|
#define EQ10_TRIM_RELEASE 0.700 /* trim release, in seconds */
|
|
|
|
|
|
#define EQ10_NOFBANDS 10 /* want more bands? not a problem */
|
|
|
|
#define EQ10_Q 1.41 /* global `Q' factor */
|
|
|
|
/* if you want separate Q per each band, comment global Q and uncomment
|
|
the following array */
|
|
|
|
//#define EQ10_DQ {1.4,1.4,1.4,1.4,1.4,1.4,1.4,1.4,1.4,1.4}
|
|
|
|
/* frequency table compatible to Q10 standard */
|
|
|
|
|
|
|
|
|
|
typedef
|
|
struct eq10band_s
|
|
{
|
|
double gain; /* gain of current band. Do not use this value,
|
|
use eq10_setgain instead */
|
|
|
|
#ifdef EQ10_DETECTOR_CODE
|
|
double detect; /* band detector value, do not use.
|
|
use eq10_detect to read detector value in dB */
|
|
|
|
double detectdecay; /* internal - do not use */
|
|
#endif
|
|
|
|
double ua0,ub1,ub2; /* internal - do not use */
|
|
double da0,db1,db2; /* internal - do not use */
|
|
double x1,x2,y1,y2; /* internal - do not use */
|
|
|
|
} eq10band_t;
|
|
|
|
|
|
typedef
|
|
struct eq10_s
|
|
{
|
|
double rate; /* sample rate; do not modify */
|
|
/* use eq10_setup to change */
|
|
|
|
eq10band_t band[EQ10_NOFBANDS]; /* bands of equalizer */
|
|
|
|
double detect; /* global detector value. do not use */
|
|
double detectdecay; /* internal - do not use */
|
|
|
|
} eq10_t;
|
|
|
|
|
|
|
|
double eq10_db2gain(double gain_dB); /* converts decibels to internal gain value*/
|
|
double eq10_gain2db(double gain); /* converts internal gain value to decibels*/
|
|
|
|
|
|
/* prepare eq array for processing,
|
|
|
|
eq - pointer to array,
|
|
eqs - number of elements in array (number of audio channels)
|
|
rate - sample rate
|
|
|
|
WARNING! this function resets all data in eq and sets all gains to 0dB
|
|
*/
|
|
void eq10_setup(eq10_t *eq, int eqs, double rate);
|
|
|
|
|
|
|
|
/* set band gain */
|
|
/*
|
|
eq - pointer to array,
|
|
eqs - number of elements in array (number of audio channels)
|
|
bandnr - # of band (0...EQ_NOFBANDS-1)
|
|
*/
|
|
void eq10_setgain(eq10_t *eq,int eqs,int bandnr,double gain_dB);
|
|
|
|
|
|
/* get current band gain */
|
|
/* eq - pointer to element, possible to read gain on each channel
|
|
separately */
|
|
double eq10_getgain(eq10_t *eq,int bandnr);
|
|
|
|
|
|
/* get detector value */
|
|
/* eq - pointer to element, possible to read detector value on
|
|
each channel separately */
|
|
double eq10_detect(eq10_t *eq,int bandnr);
|
|
|
|
|
|
/* process function
|
|
|
|
eq - pointer to eq structure, corresponding to wanted channel
|
|
buf - input buffer (interleaved multichannel)
|
|
outbuf - output buffer
|
|
sz - number of samples in input buffer
|
|
idx - index of processed channel (0...N-1)
|
|
step - total number of channels in interleaved stream (N)
|
|
|
|
*/
|
|
|
|
void eq10_processf(eq10_t *eq,float *buf,float *outbuf,int sz,int idx,int step);
|
|
|
|
|
|
/*
|
|
|
|
Example:
|
|
|
|
#define NCHAN 6
|
|
|
|
...
|
|
|
|
eq10_t eq[NCHAN]; // we process 5.1 data, thus 6 channels
|
|
int t;
|
|
eq10_t *peq;
|
|
|
|
...
|
|
|
|
eq10_setup(eq,NCHAN,44100); // initialize
|
|
|
|
...
|
|
|
|
eq10_setgain(eq,NCHAN, 5, -10.0f ); // set -10dB for gain6 (nr's from zero)
|
|
...
|
|
|
|
while (bla bla bla) // inner loop
|
|
{
|
|
for(t=0, peq=eq; t<NCHAN; t++, peq++)
|
|
{
|
|
eq10_processf(peq, input_buf, output_buf, cSamples, t, NCHAN);
|
|
}
|
|
}
|
|
|
|
...
|
|
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif //EQ10DSP_H_INCLUDED
|