Merge pull request #619 from lioncash/dpl2
Correct the function casing for DPL2Decoder
This commit is contained in:
commit
1464cfee13
|
@ -36,7 +36,8 @@ static unsigned int lfe_pos;
|
||||||
static float *filter_coefs_lfe;
|
static float *filter_coefs_lfe;
|
||||||
static unsigned int len125;
|
static unsigned int len125;
|
||||||
|
|
||||||
template<class T,class _ftype_t> static _ftype_t dotproduct(int count,const T *buf,const _ftype_t *coefficients)
|
template<class T, class _ftype_t>
|
||||||
|
static _ftype_t DotProduct(int count,const T *buf,const _ftype_t *coefficients)
|
||||||
{
|
{
|
||||||
float sum0=0,sum1=0,sum2=0,sum3=0;
|
float sum0=0,sum1=0,sum2=0,sum3=0;
|
||||||
for (;count>=4;buf+=4,coefficients+=4,count-=4)
|
for (;count>=4;buf+=4,coefficients+=4,count-=4)
|
||||||
|
@ -46,11 +47,15 @@ template<class T,class _ftype_t> static _ftype_t dotproduct(int count,const T *b
|
||||||
sum2+=buf[2]*coefficients[2];
|
sum2+=buf[2]*coefficients[2];
|
||||||
sum3+=buf[3]*coefficients[3];
|
sum3+=buf[3]*coefficients[3];
|
||||||
}
|
}
|
||||||
while (count--) sum0+= *buf++ * *coefficients++;
|
|
||||||
|
while (count--)
|
||||||
|
sum0+= *buf++ * *coefficients++;
|
||||||
|
|
||||||
return sum0+sum1+sum2+sum3;
|
return sum0+sum1+sum2+sum3;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T> static T firfilter(const T *buf, int pos, int len, int count, const float *coefficients)
|
template<class T>
|
||||||
|
static T FIRFilter(const T *buf, int pos, int len, int count, const float *coefficients)
|
||||||
{
|
{
|
||||||
int count1, count2;
|
int count1, count2;
|
||||||
|
|
||||||
|
@ -69,8 +74,8 @@ template<class T> static T firfilter(const T *buf, int pos, int len, int count,
|
||||||
// high part of window
|
// high part of window
|
||||||
const T *ptr = &buf[pos];
|
const T *ptr = &buf[pos];
|
||||||
|
|
||||||
float r1=dotproduct(count1,ptr,coefficients);coefficients+=count1;
|
float r1=DotProduct(count1,ptr,coefficients);coefficients+=count1;
|
||||||
float r2=dotproduct(count2,buf,coefficients);
|
float r2=DotProduct(count2,buf,coefficients);
|
||||||
return T(r1+r2);
|
return T(r1+r2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,7 +88,7 @@ template<class T> static T firfilter(const T *buf, int pos, int len, int count,
|
||||||
// n window length
|
// n window length
|
||||||
// w buffer for the window parameters
|
// w buffer for the window parameters
|
||||||
*/
|
*/
|
||||||
static void hamming(int n, float* w)
|
static void Hamming(int n, float* w)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
float k = float(2*M_PI/((float)(n-1))); // 2*pi/(N-1)
|
float k = float(2*M_PI/((float)(n-1))); // 2*pi/(N-1)
|
||||||
|
@ -110,7 +115,7 @@ opt beta constant used only when designing using kaiser windows
|
||||||
|
|
||||||
returns 0 if OK, -1 if fail
|
returns 0 if OK, -1 if fail
|
||||||
*/
|
*/
|
||||||
static float* design_fir(unsigned int *n, float* fc, float opt)
|
static float* DesignFIR(unsigned int *n, float* fc, float opt)
|
||||||
{
|
{
|
||||||
unsigned int o = *n & 1; // Indicator for odd filter length
|
unsigned int o = *n & 1; // Indicator for odd filter length
|
||||||
unsigned int end = ((*n + 1) >> 1) - o; // Loop end
|
unsigned int end = ((*n + 1) >> 1) - o; // Loop end
|
||||||
|
@ -129,7 +134,7 @@ static float* design_fir(unsigned int *n, float* fc, float opt)
|
||||||
float *w=(float*)calloc(sizeof(float),*n);
|
float *w=(float*)calloc(sizeof(float),*n);
|
||||||
|
|
||||||
// Get window coefficients
|
// Get window coefficients
|
||||||
hamming(*n,w);
|
Hamming(*n,w);
|
||||||
|
|
||||||
fc1=*fc;
|
fc1=*fc;
|
||||||
// Cutoff frequency must be < 0.5 where 0.5 <=> Fs/2
|
// Cutoff frequency must be < 0.5 where 0.5 <=> Fs/2
|
||||||
|
@ -165,7 +170,7 @@ static float* design_fir(unsigned int *n, float* fc, float opt)
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void onSeek(void)
|
static void OnSeek()
|
||||||
{
|
{
|
||||||
l_fwr = r_fwr = lpr_fwr = lmr_fwr = 0;
|
l_fwr = r_fwr = lpr_fwr = lmr_fwr = 0;
|
||||||
std::fill(fwrbuf_l.begin(), fwrbuf_l.end(), 0.0f);
|
std::fill(fwrbuf_l.begin(), fwrbuf_l.end(), 0.0f);
|
||||||
|
@ -181,21 +186,23 @@ static void onSeek(void)
|
||||||
memset(LFE_buf, 0, sizeof(LFE_buf));
|
memset(LFE_buf, 0, sizeof(LFE_buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void done(void)
|
static void Done()
|
||||||
{
|
{
|
||||||
onSeek();
|
OnSeek();
|
||||||
|
|
||||||
if (filter_coefs_lfe)
|
if (filter_coefs_lfe)
|
||||||
{
|
{
|
||||||
free(filter_coefs_lfe);
|
free(filter_coefs_lfe);
|
||||||
}
|
}
|
||||||
|
|
||||||
filter_coefs_lfe = nullptr;
|
filter_coefs_lfe = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static float* calc_coefficients_125Hz_lowpass(int rate)
|
static float* CalculateCoefficients125HzLowpass(int rate)
|
||||||
{
|
{
|
||||||
len125 = 256;
|
len125 = 256;
|
||||||
float f = 125.0f / (rate / 2);
|
float f = 125.0f / (rate / 2);
|
||||||
float *coeffs = design_fir(&len125, &f, 0);
|
float *coeffs = DesignFIR(&len125, &f, 0);
|
||||||
static const float M3_01DB = 0.7071067812f;
|
static const float M3_01DB = 0.7071067812f;
|
||||||
for (unsigned int i = 0; i < len125; i++)
|
for (unsigned int i = 0; i < len125; i++)
|
||||||
{
|
{
|
||||||
|
@ -204,7 +211,7 @@ static float* calc_coefficients_125Hz_lowpass(int rate)
|
||||||
return coeffs;
|
return coeffs;
|
||||||
}
|
}
|
||||||
|
|
||||||
static float passive_lock(float x)
|
static float PassiveLock(float x)
|
||||||
{
|
{
|
||||||
static const float MATAGCLOCK = 0.2f; /* AGC range (around 1) where the matrix behaves passively */
|
static const float MATAGCLOCK = 0.2f; /* AGC range (around 1) where the matrix behaves passively */
|
||||||
const float x1 = x - 1;
|
const float x1 = x - 1;
|
||||||
|
@ -212,7 +219,7 @@ static float passive_lock(float x)
|
||||||
return x1 - x1 / (1 + ax1s * ax1s) + 1;
|
return x1 - x1 / (1 + ax1s * ax1s) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void matrix_decode(const float *in, const int k, const int il,
|
static void MatrixDecode(const float *in, const int k, const int il,
|
||||||
const int ir, bool decode_rear,
|
const int ir, bool decode_rear,
|
||||||
const int _dlbuflen,
|
const int _dlbuflen,
|
||||||
float _l_fwr, float _r_fwr,
|
float _l_fwr, float _r_fwr,
|
||||||
|
@ -251,8 +258,8 @@ static void matrix_decode(const float *in, const int k, const int il,
|
||||||
*_adapt_l_gain = (1 - f) * *_adapt_l_gain + f * l_gain;
|
*_adapt_l_gain = (1 - f) * *_adapt_l_gain + f * l_gain;
|
||||||
*_adapt_r_gain = (1 - f) * *_adapt_r_gain + f * r_gain;
|
*_adapt_r_gain = (1 - f) * *_adapt_r_gain + f * r_gain;
|
||||||
/* Matrix */
|
/* Matrix */
|
||||||
l_agc = in[il] * passive_lock(*_adapt_l_gain);
|
l_agc = in[il] * PassiveLock(*_adapt_l_gain);
|
||||||
r_agc = in[ir] * passive_lock(*_adapt_r_gain);
|
r_agc = in[ir] * PassiveLock(*_adapt_r_gain);
|
||||||
_cf[k] = (l_agc + r_agc) * (float)M_SQRT1_2;
|
_cf[k] = (l_agc + r_agc) * (float)M_SQRT1_2;
|
||||||
if (decode_rear)
|
if (decode_rear)
|
||||||
{
|
{
|
||||||
|
@ -274,8 +281,8 @@ static void matrix_decode(const float *in, const int k, const int il,
|
||||||
*_adapt_lpr_gain = (1 - f) * *_adapt_lpr_gain + f * lpr_gain;
|
*_adapt_lpr_gain = (1 - f) * *_adapt_lpr_gain + f * lpr_gain;
|
||||||
*_adapt_lmr_gain = (1 - f) * *_adapt_lmr_gain + f * lmr_gain;
|
*_adapt_lmr_gain = (1 - f) * *_adapt_lmr_gain + f * lmr_gain;
|
||||||
/* Matrix */
|
/* Matrix */
|
||||||
lpr_agc = lpr * passive_lock(*_adapt_lpr_gain);
|
lpr_agc = lpr * PassiveLock(*_adapt_lpr_gain);
|
||||||
lmr_agc = lmr * passive_lock(*_adapt_lmr_gain);
|
lmr_agc = lmr * PassiveLock(*_adapt_lmr_gain);
|
||||||
_lf[k] = (lpr_agc + lmr_agc) * (float)M_SQRT1_2;
|
_lf[k] = (lpr_agc + lmr_agc) * (float)M_SQRT1_2;
|
||||||
_rf[k] = (lpr_agc - lmr_agc) * (float)M_SQRT1_2;
|
_rf[k] = (lpr_agc - lmr_agc) * (float)M_SQRT1_2;
|
||||||
|
|
||||||
|
@ -297,7 +304,7 @@ static void matrix_decode(const float *in, const int k, const int il,
|
||||||
_cf[k] += c_agc_cfk + c_agc_cfk;
|
_cf[k] += c_agc_cfk + c_agc_cfk;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dpl2decode(float *samples, int numsamples, float *out)
|
void DPL2Decode(float *samples, int numsamples, float *out)
|
||||||
{
|
{
|
||||||
static const unsigned int FWRDURATION = 240; // FWR average duration (samples)
|
static const unsigned int FWRDURATION = 240; // FWR average duration (samples)
|
||||||
static const int cfg_delay = 0;
|
static const int cfg_delay = 0;
|
||||||
|
@ -308,7 +315,7 @@ void dpl2decode(float *samples, int numsamples, float *out)
|
||||||
|
|
||||||
if (olddelay != cfg_delay || oldfreq != fmt_freq)
|
if (olddelay != cfg_delay || oldfreq != fmt_freq)
|
||||||
{
|
{
|
||||||
done();
|
Done();
|
||||||
olddelay = cfg_delay;
|
olddelay = cfg_delay;
|
||||||
oldfreq = fmt_freq;
|
oldfreq = fmt_freq;
|
||||||
dlbuflen = std::max(FWRDURATION, (fmt_freq * cfg_delay / 1000)); //+(len7000-1);
|
dlbuflen = std::max(FWRDURATION, (fmt_freq * cfg_delay / 1000)); //+(len7000-1);
|
||||||
|
@ -321,7 +328,7 @@ void dpl2decode(float *samples, int numsamples, float *out)
|
||||||
rr.resize(dlbuflen);
|
rr.resize(dlbuflen);
|
||||||
cf.resize(dlbuflen);
|
cf.resize(dlbuflen);
|
||||||
cr.resize(dlbuflen);
|
cr.resize(dlbuflen);
|
||||||
filter_coefs_lfe = calc_coefficients_125Hz_lowpass(fmt_freq);
|
filter_coefs_lfe = CalculateCoefficients125HzLowpass(fmt_freq);
|
||||||
lfe_pos = 0;
|
lfe_pos = 0;
|
||||||
memset(LFE_buf, 0, sizeof(LFE_buf));
|
memset(LFE_buf, 0, sizeof(LFE_buf));
|
||||||
}
|
}
|
||||||
|
@ -344,7 +351,7 @@ void dpl2decode(float *samples, int numsamples, float *out)
|
||||||
/* Matrix encoded 2 channel sources */
|
/* Matrix encoded 2 channel sources */
|
||||||
fwrbuf_l[k] = in[0];
|
fwrbuf_l[k] = in[0];
|
||||||
fwrbuf_r[k] = in[1];
|
fwrbuf_r[k] = in[1];
|
||||||
matrix_decode(in, k, 0, 1, true, dlbuflen,
|
MatrixDecode(in, k, 0, 1, true, dlbuflen,
|
||||||
l_fwr, r_fwr,
|
l_fwr, r_fwr,
|
||||||
lpr_fwr, lmr_fwr,
|
lpr_fwr, lmr_fwr,
|
||||||
&adapt_l_gain, &adapt_r_gain,
|
&adapt_l_gain, &adapt_r_gain,
|
||||||
|
@ -355,7 +362,7 @@ void dpl2decode(float *samples, int numsamples, float *out)
|
||||||
out[cur + 1] = rf[k];
|
out[cur + 1] = rf[k];
|
||||||
out[cur + 2] = cf[k];
|
out[cur + 2] = cf[k];
|
||||||
LFE_buf[lfe_pos] = (out[0] + out[1]) / 2;
|
LFE_buf[lfe_pos] = (out[0] + out[1]) / 2;
|
||||||
out[cur + 3] = firfilter(LFE_buf, lfe_pos, len125, len125, filter_coefs_lfe);
|
out[cur + 3] = FIRFilter(LFE_buf, lfe_pos, len125, len125, filter_coefs_lfe);
|
||||||
lfe_pos++;
|
lfe_pos++;
|
||||||
if (lfe_pos == len125)
|
if (lfe_pos == len125)
|
||||||
{
|
{
|
||||||
|
@ -374,7 +381,7 @@ void dpl2decode(float *samples, int numsamples, float *out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dpl2reset()
|
void DPL2Reset()
|
||||||
{
|
{
|
||||||
olddelay = -1;
|
olddelay = -1;
|
||||||
oldfreq = 0;
|
oldfreq = 0;
|
||||||
|
|
|
@ -4,5 +4,5 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void dpl2decode(float *samples, int numsamples, float *out);
|
void DPL2Decode(float *samples, int numsamples, float *out);
|
||||||
void dpl2reset();
|
void DPL2Reset();
|
||||||
|
|
|
@ -58,7 +58,7 @@ bool OpenALStream::Start()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize DPL2 parameters
|
// Initialize DPL2 parameters
|
||||||
dpl2reset();
|
DPL2Reset();
|
||||||
|
|
||||||
soundTouch.clear();
|
soundTouch.clear();
|
||||||
return bReturn;
|
return bReturn;
|
||||||
|
@ -246,7 +246,7 @@ void OpenALStream::SoundLoop()
|
||||||
if (surround_capable)
|
if (surround_capable)
|
||||||
{
|
{
|
||||||
float dpl2[OAL_MAX_SAMPLES * OAL_MAX_BUFFERS * SURROUND_CHANNELS];
|
float dpl2[OAL_MAX_SAMPLES * OAL_MAX_BUFFERS * SURROUND_CHANNELS];
|
||||||
dpl2decode(sampleBuffer, nSamples, dpl2);
|
DPL2Decode(sampleBuffer, nSamples, dpl2);
|
||||||
alBufferData(uiBufferTemp[iBuffersFilled], AL_FORMAT_51CHN32, dpl2, nSamples * FRAME_SURROUND_FLOAT, ulFrequency);
|
alBufferData(uiBufferTemp[iBuffersFilled], AL_FORMAT_51CHN32, dpl2, nSamples * FRAME_SURROUND_FLOAT, ulFrequency);
|
||||||
ALenum err = alGetError();
|
ALenum err = alGetError();
|
||||||
if (err == AL_INVALID_ENUM)
|
if (err == AL_INVALID_ENUM)
|
||||||
|
|
Loading…
Reference in New Issue