[FreeSurround] Actually make it work
Apparently, the LFE channel is not being initialized at all if bass redirection isn't enabled, and even if it is, it's uninitialized for a great portion of the spectrum. Clear it all on every iteration. Signed-off-by: Christopher Snowhill <kode54@gmail.com>main
parent
eb0c1a8463
commit
7de0792b97
|
@ -49,21 +49,12 @@ static void _dsp_complexfree(DSPDoubleSplitComplex *cpx) {
|
||||||
free(cpx->imagp);
|
free(cpx->imagp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int log2n(int n) {
|
|
||||||
int pow = 1;
|
|
||||||
while(n > 2) {
|
|
||||||
pow++;
|
|
||||||
n /= 2;
|
|
||||||
}
|
|
||||||
return pow;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FreeSurround implementation
|
// FreeSurround implementation
|
||||||
class decoder_impl {
|
class decoder_impl {
|
||||||
public:
|
public:
|
||||||
// instantiate the decoder with a given channel setup and processing block size (in samples)
|
// instantiate the decoder with a given channel setup and processing block size (in samples)
|
||||||
decoder_impl(channel_setup setup, unsigned N)
|
decoder_impl(channel_setup setup, unsigned N)
|
||||||
: N(N), log2N(log2n(N)),
|
: N(N),
|
||||||
wnd(N), inbuf(3 * N), setup(setup), C((unsigned)chn_alloc[setup].size()),
|
wnd(N), inbuf(3 * N), setup(setup), C((unsigned)chn_alloc[setup].size()),
|
||||||
buffer_empty(true), lt(N), rt(N), dst(N), dstf(N),
|
buffer_empty(true), lt(N), rt(N), dst(N), dstf(N),
|
||||||
dftsetupF(vDSP_DFT_zrop_CreateSetupD(0, N, vDSP_DFT_FORWARD)),
|
dftsetupF(vDSP_DFT_zrop_CreateSetupD(0, N, vDSP_DFT_FORWARD)),
|
||||||
|
@ -92,6 +83,8 @@ class decoder_impl {
|
||||||
set_low_cutoff(40.0 / 22050);
|
set_low_cutoff(40.0 / 22050);
|
||||||
set_high_cutoff(90.0 / 22050);
|
set_high_cutoff(90.0 / 22050);
|
||||||
set_bass_redirection(false);
|
set_bass_redirection(false);
|
||||||
|
|
||||||
|
flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
~decoder_impl() {
|
~decoder_impl() {
|
||||||
|
@ -222,6 +215,9 @@ class decoder_impl {
|
||||||
signal[c].imagp[N/2] = 0;
|
signal[c].imagp[N/2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bzero(signal[C - 1].realp, sizeof(double) * (N / 2 + 1));
|
||||||
|
bzero(signal[C - 1].imagp, sizeof(double) * (N / 2 + 1));
|
||||||
|
|
||||||
// compute multichannel output signal in the spectral domain
|
// compute multichannel output signal in the spectral domain
|
||||||
for(unsigned f = 1; f < N / 2; f++) {
|
for(unsigned f = 1; f < N / 2; f++) {
|
||||||
// get Lt/Rt amplitudes & phases
|
// get Lt/Rt amplitudes & phases
|
||||||
|
@ -336,7 +332,6 @@ class decoder_impl {
|
||||||
|
|
||||||
// constants
|
// constants
|
||||||
unsigned N, C; // number of samples per input/output block, number of output channels
|
unsigned N, C; // number of samples per input/output block, number of output channels
|
||||||
unsigned log2N; // derivations of the block size
|
|
||||||
channel_setup setup; // the channel setup
|
channel_setup setup; // the channel setup
|
||||||
|
|
||||||
// parameters
|
// parameters
|
||||||
|
|
Loading…
Reference in New Issue