Use member functions for BFormatDec and AmbiUpsampler
This commit is contained in:
+8
-12
@@ -109,9 +109,8 @@ namespace {
|
||||
void ProcessHrtf(ALCdevice *device, ALsizei SamplesToDo)
|
||||
{
|
||||
if(device->AmbiUp)
|
||||
ambiup_process(device->AmbiUp.get(),
|
||||
device->Dry.Buffer, device->Dry.NumChannels, device->FOAOut.Buffer,
|
||||
SamplesToDo
|
||||
device->AmbiUp->process(device->Dry.Buffer, device->Dry.NumChannels,
|
||||
device->FOAOut.Buffer, SamplesToDo
|
||||
);
|
||||
|
||||
int lidx{GetChannelIdxByName(&device->RealOut, FrontLeft)};
|
||||
@@ -132,21 +131,18 @@ void ProcessHrtf(ALCdevice *device, ALsizei SamplesToDo)
|
||||
void ProcessAmbiDec(ALCdevice *device, ALsizei SamplesToDo)
|
||||
{
|
||||
if(device->Dry.Buffer != device->FOAOut.Buffer)
|
||||
bformatdec_upSample(device->AmbiDecoder.get(),
|
||||
device->Dry.Buffer, device->FOAOut.Buffer, device->FOAOut.NumChannels,
|
||||
SamplesToDo
|
||||
device->AmbiDecoder->upSample(device->Dry.Buffer, device->FOAOut.Buffer,
|
||||
device->FOAOut.NumChannels, SamplesToDo
|
||||
);
|
||||
bformatdec_process(device->AmbiDecoder.get(),
|
||||
device->RealOut.Buffer, device->RealOut.NumChannels, device->Dry.Buffer,
|
||||
SamplesToDo
|
||||
device->AmbiDecoder->process(device->RealOut.Buffer, device->RealOut.NumChannels,
|
||||
device->Dry.Buffer, SamplesToDo
|
||||
);
|
||||
}
|
||||
|
||||
void ProcessAmbiUp(ALCdevice *device, ALsizei SamplesToDo)
|
||||
{
|
||||
ambiup_process(device->AmbiUp.get(),
|
||||
device->RealOut.Buffer, device->RealOut.NumChannels, device->FOAOut.Buffer,
|
||||
SamplesToDo
|
||||
device->AmbiUp->process(device->RealOut.Buffer, device->RealOut.NumChannels,
|
||||
device->FOAOut.Buffer, SamplesToDo
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
+75
-84
@@ -64,8 +64,8 @@ namespace {
|
||||
|
||||
#define HF_BAND 0
|
||||
#define LF_BAND 1
|
||||
static_assert(BFormatDec::NumBands == 2, "Unexpected BFormatDec::NumBands");
|
||||
static_assert(AmbiUpsampler::NumBands == 2, "Unexpected AmbiUpsampler::NumBands");
|
||||
static_assert(BFormatDec::sNumBands == 2, "Unexpected BFormatDec::sNumBands");
|
||||
static_assert(AmbiUpsampler::sNumBands == 2, "Unexpected AmbiUpsampler::sNumBands");
|
||||
|
||||
/* These points are in AL coordinates! */
|
||||
constexpr ALfloat Ambi3DPoints[8][3] = {
|
||||
@@ -110,23 +110,23 @@ ALsizei GetACNIndex(const BFChannelConfig *chans, ALsizei numchans, ALsizei acn)
|
||||
} // namespace
|
||||
|
||||
|
||||
void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount, ALuint srate, const ALsizei (&chanmap)[MAX_OUTPUT_CHANNELS])
|
||||
void BFormatDec::reset(const AmbDecConf *conf, ALsizei chancount, ALuint srate, const ALsizei (&chanmap)[MAX_OUTPUT_CHANNELS])
|
||||
{
|
||||
static constexpr ALsizei map2DTo3D[MAX_AMBI2D_COEFFS] = {
|
||||
0, 1, 3, 4, 8, 9, 15
|
||||
};
|
||||
const ALfloat *coeff_scale = N3D2N3DScale;
|
||||
|
||||
dec->Samples.clear();
|
||||
dec->SamplesHF = nullptr;
|
||||
dec->SamplesLF = nullptr;
|
||||
mSamples.clear();
|
||||
mSamplesHF = nullptr;
|
||||
mSamplesLF = nullptr;
|
||||
|
||||
dec->NumChannels = chancount;
|
||||
dec->Samples.resize(dec->NumChannels * 2);
|
||||
dec->SamplesHF = dec->Samples.data();
|
||||
dec->SamplesLF = dec->SamplesHF + dec->NumChannels;
|
||||
mNumChannels = chancount;
|
||||
mSamples.resize(mNumChannels * 2);
|
||||
mSamplesHF = mSamples.data();
|
||||
mSamplesLF = mSamplesHF + mNumChannels;
|
||||
|
||||
dec->Enabled = std::accumulate(std::begin(chanmap), std::begin(chanmap)+conf->NumSpeakers, 0u,
|
||||
mEnabled = std::accumulate(std::begin(chanmap), std::begin(chanmap)+conf->NumSpeakers, 0u,
|
||||
[](ALuint mask, const ALsizei &chan) noexcept -> ALuint
|
||||
{ return mask | (1 << chan); }
|
||||
);
|
||||
@@ -137,7 +137,7 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount
|
||||
coeff_scale = FuMa2N3DScale;
|
||||
|
||||
float ratio{400.0f / (float)srate};
|
||||
for(auto &chan : dec->UpSampler)
|
||||
for(auto &chan : mUpSampler)
|
||||
{
|
||||
chan.XOver.init(ratio);
|
||||
chan.XOver.clear();
|
||||
@@ -147,35 +147,35 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount
|
||||
const bool periphonic{(conf->ChanMask&AMBI_PERIPHONIC_MASK) != 0};
|
||||
if(periphonic)
|
||||
{
|
||||
dec->UpSampler[0].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? W_SCALE_3H3P :
|
||||
(conf->ChanMask > 0xf) ? W_SCALE_2H2P : 1.0f;
|
||||
dec->UpSampler[0].Gains[LF_BAND] = 1.0f;
|
||||
mUpSampler[0].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? W_SCALE_3H3P :
|
||||
(conf->ChanMask > 0xf) ? W_SCALE_2H2P : 1.0f;
|
||||
mUpSampler[0].Gains[LF_BAND] = 1.0f;
|
||||
for(ALsizei i{1};i < 4;i++)
|
||||
{
|
||||
dec->UpSampler[i].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? XYZ_SCALE_3H3P :
|
||||
(conf->ChanMask > 0xf) ? XYZ_SCALE_2H2P : 1.0f;
|
||||
dec->UpSampler[i].Gains[LF_BAND] = 1.0f;
|
||||
mUpSampler[i].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? XYZ_SCALE_3H3P :
|
||||
(conf->ChanMask > 0xf) ? XYZ_SCALE_2H2P : 1.0f;
|
||||
mUpSampler[i].Gains[LF_BAND] = 1.0f;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dec->UpSampler[0].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? W_SCALE_3H0P :
|
||||
(conf->ChanMask > 0xf) ? W_SCALE_2H0P : 1.0f;
|
||||
dec->UpSampler[0].Gains[LF_BAND] = 1.0f;
|
||||
mUpSampler[0].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? W_SCALE_3H0P :
|
||||
(conf->ChanMask > 0xf) ? W_SCALE_2H0P : 1.0f;
|
||||
mUpSampler[0].Gains[LF_BAND] = 1.0f;
|
||||
for(ALsizei i{1};i < 3;i++)
|
||||
{
|
||||
dec->UpSampler[i].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? XYZ_SCALE_3H0P :
|
||||
(conf->ChanMask > 0xf) ? XYZ_SCALE_2H0P : 1.0f;
|
||||
dec->UpSampler[i].Gains[LF_BAND] = 1.0f;
|
||||
mUpSampler[i].Gains[HF_BAND] = (conf->ChanMask > 0x1ff) ? XYZ_SCALE_3H0P :
|
||||
(conf->ChanMask > 0xf) ? XYZ_SCALE_2H0P : 1.0f;
|
||||
mUpSampler[i].Gains[LF_BAND] = 1.0f;
|
||||
}
|
||||
dec->UpSampler[3].Gains[HF_BAND] = 0.0f;
|
||||
dec->UpSampler[3].Gains[LF_BAND] = 0.0f;
|
||||
mUpSampler[3].Gains[HF_BAND] = 0.0f;
|
||||
mUpSampler[3].Gains[LF_BAND] = 0.0f;
|
||||
}
|
||||
|
||||
memset(&dec->Matrix, 0, sizeof(dec->Matrix));
|
||||
memset(&mMatrix, 0, sizeof(mMatrix));
|
||||
if(conf->FreqBands == 1)
|
||||
{
|
||||
dec->DualBand = AL_FALSE;
|
||||
mDualBand = AL_FALSE;
|
||||
for(ALsizei i{0};i < conf->NumSpeakers;i++)
|
||||
{
|
||||
ALsizei chan = chanmap[i];
|
||||
@@ -192,8 +192,7 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount
|
||||
else if(j == 3) gain = conf->HFOrderGain[2];
|
||||
else if(j == 5) gain = conf->HFOrderGain[3];
|
||||
if((conf->ChanMask&(1<<l)))
|
||||
dec->Matrix.Single[chan][j] = conf->HFMatrix[i][k++] / coeff_scale[l] *
|
||||
gain;
|
||||
mMatrix.Single[chan][j] = conf->HFMatrix[i][k++] / coeff_scale[l] * gain;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -205,8 +204,7 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount
|
||||
else if(j == 4) gain = conf->HFOrderGain[2];
|
||||
else if(j == 9) gain = conf->HFOrderGain[3];
|
||||
if((conf->ChanMask&(1<<j)))
|
||||
dec->Matrix.Single[chan][j] = conf->HFMatrix[i][k++] / coeff_scale[j] *
|
||||
gain;
|
||||
mMatrix.Single[chan][j] = conf->HFMatrix[i][k++] / coeff_scale[j] * gain;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -214,10 +212,10 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount
|
||||
else
|
||||
{
|
||||
using namespace std::placeholders;
|
||||
dec->DualBand = AL_TRUE;
|
||||
mDualBand = AL_TRUE;
|
||||
|
||||
ratio = conf->XOverFreq / (ALfloat)srate;
|
||||
std::for_each(std::begin(dec->XOver), std::end(dec->XOver),
|
||||
std::for_each(std::begin(mXOver), std::end(mXOver),
|
||||
std::bind(std::mem_fn(&BandSplitter::init), _1, ratio));
|
||||
|
||||
ratio = powf(10.0f, conf->XOverRatio / 40.0f);
|
||||
@@ -237,8 +235,8 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount
|
||||
else if(j == 3) gain = conf->HFOrderGain[2] * ratio;
|
||||
else if(j == 5) gain = conf->HFOrderGain[3] * ratio;
|
||||
if((conf->ChanMask&(1<<l)))
|
||||
dec->Matrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] /
|
||||
coeff_scale[l] * gain;
|
||||
mMatrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] / coeff_scale[l] *
|
||||
gain;
|
||||
}
|
||||
for(j = 0,k = 0;j < MAX_AMBI2D_COEFFS;j++)
|
||||
{
|
||||
@@ -248,8 +246,8 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount
|
||||
else if(j == 3) gain = conf->LFOrderGain[2] / ratio;
|
||||
else if(j == 5) gain = conf->LFOrderGain[3] / ratio;
|
||||
if((conf->ChanMask&(1<<l)))
|
||||
dec->Matrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] /
|
||||
coeff_scale[l] * gain;
|
||||
mMatrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] / coeff_scale[l] *
|
||||
gain;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -261,8 +259,8 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount
|
||||
else if(j == 4) gain = conf->HFOrderGain[2] * ratio;
|
||||
else if(j == 9) gain = conf->HFOrderGain[3] * ratio;
|
||||
if((conf->ChanMask&(1<<j)))
|
||||
dec->Matrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] /
|
||||
coeff_scale[j] * gain;
|
||||
mMatrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] / coeff_scale[j] *
|
||||
gain;
|
||||
}
|
||||
for(j = 0,k = 0;j < MAX_AMBI_COEFFS;j++)
|
||||
{
|
||||
@@ -271,43 +269,42 @@ void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount
|
||||
else if(j == 4) gain = conf->LFOrderGain[2] / ratio;
|
||||
else if(j == 9) gain = conf->LFOrderGain[3] / ratio;
|
||||
if((conf->ChanMask&(1<<j)))
|
||||
dec->Matrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] /
|
||||
coeff_scale[j] * gain;
|
||||
mMatrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] / coeff_scale[j] *
|
||||
gain;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void bformatdec_process(struct BFormatDec *dec, ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], ALsizei SamplesToDo)
|
||||
void BFormatDec::process(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei SamplesToDo)
|
||||
{
|
||||
ASSUME(OutChannels > 0);
|
||||
ASSUME(SamplesToDo > 0);
|
||||
|
||||
ALsizei chan, i;
|
||||
if(dec->DualBand)
|
||||
if(mDualBand)
|
||||
{
|
||||
for(i = 0;i < dec->NumChannels;i++)
|
||||
dec->XOver[i].process(dec->SamplesHF[i].data(), dec->SamplesLF[i].data(), InSamples[i],
|
||||
SamplesToDo);
|
||||
for(i = 0;i < mNumChannels;i++)
|
||||
mXOver[i].process(mSamplesHF[i].data(), mSamplesLF[i].data(), InSamples[i],
|
||||
SamplesToDo);
|
||||
|
||||
for(chan = 0;chan < OutChannels;chan++)
|
||||
{
|
||||
if(UNLIKELY(!(dec->Enabled&(1<<chan))))
|
||||
if(UNLIKELY(!(mEnabled&(1<<chan))))
|
||||
continue;
|
||||
|
||||
std::fill(std::begin(dec->ChannelMix), std::begin(dec->ChannelMix)+SamplesToDo, 0.0f);
|
||||
MixRowSamples(dec->ChannelMix, dec->Matrix.Dual[chan][HF_BAND],
|
||||
&reinterpret_cast<ALfloat(&)[BUFFERSIZE]>(dec->SamplesHF[0]),
|
||||
dec->NumChannels, 0, SamplesToDo
|
||||
std::fill(std::begin(mChannelMix), std::begin(mChannelMix)+SamplesToDo, 0.0f);
|
||||
MixRowSamples(mChannelMix, mMatrix.Dual[chan][HF_BAND],
|
||||
&reinterpret_cast<ALfloat(&)[BUFFERSIZE]>(mSamplesHF[0]),
|
||||
mNumChannels, 0, SamplesToDo
|
||||
);
|
||||
MixRowSamples(dec->ChannelMix, dec->Matrix.Dual[chan][LF_BAND],
|
||||
&reinterpret_cast<ALfloat(&)[BUFFERSIZE]>(dec->SamplesLF[0]),
|
||||
dec->NumChannels, 0, SamplesToDo
|
||||
MixRowSamples(mChannelMix, mMatrix.Dual[chan][LF_BAND],
|
||||
&reinterpret_cast<ALfloat(&)[BUFFERSIZE]>(mSamplesLF[0]),
|
||||
mNumChannels, 0, SamplesToDo
|
||||
);
|
||||
|
||||
std::transform(std::begin(dec->ChannelMix), std::begin(dec->ChannelMix)+SamplesToDo,
|
||||
std::transform(std::begin(mChannelMix), std::begin(mChannelMix)+SamplesToDo,
|
||||
OutBuffer[chan], OutBuffer[chan], std::plus<float>());
|
||||
}
|
||||
}
|
||||
@@ -315,21 +312,20 @@ void bformatdec_process(struct BFormatDec *dec, ALfloat (*RESTRICT OutBuffer)[BU
|
||||
{
|
||||
for(chan = 0;chan < OutChannels;chan++)
|
||||
{
|
||||
if(UNLIKELY(!(dec->Enabled&(1<<chan))))
|
||||
if(UNLIKELY(!(mEnabled&(1<<chan))))
|
||||
continue;
|
||||
|
||||
std::fill(std::begin(dec->ChannelMix), std::begin(dec->ChannelMix)+SamplesToDo, 0.0f);
|
||||
MixRowSamples(dec->ChannelMix, dec->Matrix.Single[chan], InSamples,
|
||||
dec->NumChannels, 0, SamplesToDo);
|
||||
std::fill(std::begin(mChannelMix), std::begin(mChannelMix)+SamplesToDo, 0.0f);
|
||||
MixRowSamples(mChannelMix, mMatrix.Single[chan], InSamples,
|
||||
mNumChannels, 0, SamplesToDo);
|
||||
|
||||
std::transform(std::begin(dec->ChannelMix), std::begin(dec->ChannelMix)+SamplesToDo,
|
||||
std::transform(std::begin(mChannelMix), std::begin(mChannelMix)+SamplesToDo,
|
||||
OutBuffer[chan], OutBuffer[chan], std::plus<float>());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void bformatdec_upSample(struct BFormatDec *dec, ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], ALsizei InChannels, ALsizei SamplesToDo)
|
||||
void BFormatDec::upSample(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei InChannels, const ALsizei SamplesToDo)
|
||||
{
|
||||
ASSUME(InChannels > 0);
|
||||
ASSUME(SamplesToDo > 0);
|
||||
@@ -349,28 +345,26 @@ void bformatdec_upSample(struct BFormatDec *dec, ALfloat (*RESTRICT OutBuffer)[B
|
||||
/* First, split the first-order components into low and high frequency
|
||||
* bands.
|
||||
*/
|
||||
dec->UpSampler[i].XOver.process(dec->Samples[HF_BAND].data(), dec->Samples[LF_BAND].data(),
|
||||
InSamples[i], SamplesToDo
|
||||
);
|
||||
mUpSampler[i].XOver.process(mSamples[HF_BAND].data(), mSamples[LF_BAND].data(),
|
||||
InSamples[i], SamplesToDo);
|
||||
|
||||
/* Now write each band to the output. */
|
||||
MixRowSamples(OutBuffer[i], dec->UpSampler[i].Gains,
|
||||
&reinterpret_cast<ALfloat(&)[BUFFERSIZE]>(dec->Samples[0]),
|
||||
BFormatDec::NumBands, 0, SamplesToDo
|
||||
);
|
||||
MixRowSamples(OutBuffer[i], mUpSampler[i].Gains,
|
||||
&reinterpret_cast<ALfloat(&)[BUFFERSIZE]>(mSamples[0]),
|
||||
sNumBands, 0, SamplesToDo);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device, ALfloat w_scale, ALfloat xyz_scale)
|
||||
void AmbiUpsampler::reset(const ALCdevice *device, const ALfloat w_scale, const ALfloat xyz_scale)
|
||||
{
|
||||
using namespace std::placeholders;
|
||||
|
||||
float ratio{400.0f / (float)device->Frequency};
|
||||
std::for_each(std::begin(ambiup->XOver), std::end(ambiup->XOver),
|
||||
std::for_each(std::begin(mXOver), std::end(mXOver),
|
||||
std::bind(std::mem_fn(&BandSplitter::init), _1, ratio));
|
||||
|
||||
memset(ambiup->Gains, 0, sizeof(ambiup->Gains));
|
||||
memset(mGains, 0, sizeof(mGains));
|
||||
if(device->Dry.CoeffCount > 0)
|
||||
{
|
||||
ALfloat encgains[8][MAX_OUTPUT_CHANNELS];
|
||||
@@ -393,8 +387,8 @@ void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device, ALfloat
|
||||
ALdouble gain = 0.0;
|
||||
for(size_t k{0u};k < COUNTOF(Ambi3DDecoder);k++)
|
||||
gain += (ALdouble)Ambi3DDecoder[k][i] * encgains[k][j];
|
||||
ambiup->Gains[i][j][HF_BAND] = (ALfloat)(gain * Ambi3DDecoderHFScale[i]);
|
||||
ambiup->Gains[i][j][LF_BAND] = (ALfloat)gain;
|
||||
mGains[i][j][HF_BAND] = (ALfloat)(gain * Ambi3DDecoderHFScale[i]);
|
||||
mGains[i][j][LF_BAND] = (ALfloat)gain;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -406,26 +400,23 @@ void ambiup_reset(struct AmbiUpsampler *ambiup, const ALCdevice *device, ALfloat
|
||||
if(index != INVALID_UPSAMPLE_INDEX)
|
||||
{
|
||||
ALfloat scale = device->Dry.Ambi.Map[index].Scale;
|
||||
ambiup->Gains[i][index][HF_BAND] = scale * ((i==0) ? w_scale : xyz_scale);
|
||||
ambiup->Gains[i][index][LF_BAND] = scale;
|
||||
mGains[i][index][HF_BAND] = scale * ((i==0) ? w_scale : xyz_scale);
|
||||
mGains[i][index][LF_BAND] = scale;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ambiup_process(struct AmbiUpsampler *ambiup, ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], ALsizei SamplesToDo)
|
||||
void AmbiUpsampler::process(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei SamplesToDo)
|
||||
{
|
||||
ASSUME(OutChannels > 0);
|
||||
ASSUME(SamplesToDo > 0);
|
||||
|
||||
for(ALsizei i{0};i < 4;i++)
|
||||
{
|
||||
ambiup->XOver[i].process(ambiup->Samples[HF_BAND], ambiup->Samples[LF_BAND], InSamples[i],
|
||||
SamplesToDo);
|
||||
mXOver[i].process(mSamples[HF_BAND], mSamples[LF_BAND], InSamples[i], SamplesToDo);
|
||||
|
||||
for(ALsizei j{0};j < OutChannels;j++)
|
||||
MixRowSamples(OutBuffer[j], ambiup->Gains[i][j],
|
||||
ambiup->Samples, AmbiUpsampler::NumBands, 0, SamplesToDo
|
||||
);
|
||||
MixRowSamples(OutBuffer[j], mGains[i][j], mSamples, sNumBands, 0, SamplesToDo);
|
||||
}
|
||||
}
|
||||
|
||||
+36
-30
@@ -34,62 +34,68 @@ extern const ALfloat SN3D2N3DScale[MAX_AMBI_COEFFS];
|
||||
extern const ALfloat FuMa2N3DScale[MAX_AMBI_COEFFS];
|
||||
|
||||
|
||||
struct BFormatDec {
|
||||
static constexpr size_t NumBands{2};
|
||||
class BFormatDec {
|
||||
public:
|
||||
static constexpr size_t sNumBands{2};
|
||||
|
||||
ALuint Enabled; /* Bitfield of enabled channels. */
|
||||
private:
|
||||
ALuint mEnabled; /* Bitfield of enabled channels. */
|
||||
|
||||
union {
|
||||
alignas(16) ALfloat Dual[MAX_OUTPUT_CHANNELS][NumBands][MAX_AMBI_COEFFS];
|
||||
alignas(16) ALfloat Dual[MAX_OUTPUT_CHANNELS][sNumBands][MAX_AMBI_COEFFS];
|
||||
alignas(16) ALfloat Single[MAX_OUTPUT_CHANNELS][MAX_AMBI_COEFFS];
|
||||
} Matrix;
|
||||
} mMatrix;
|
||||
|
||||
/* NOTE: BandSplitter filters are unused with single-band decoding */
|
||||
BandSplitter XOver[MAX_AMBI_COEFFS];
|
||||
BandSplitter mXOver[MAX_AMBI_COEFFS];
|
||||
|
||||
al::vector<std::array<ALfloat,BUFFERSIZE>, 16> Samples;
|
||||
al::vector<std::array<ALfloat,BUFFERSIZE>, 16> mSamples;
|
||||
/* These two alias into Samples */
|
||||
std::array<ALfloat,BUFFERSIZE> *SamplesHF;
|
||||
std::array<ALfloat,BUFFERSIZE> *SamplesLF;
|
||||
std::array<ALfloat,BUFFERSIZE> *mSamplesHF;
|
||||
std::array<ALfloat,BUFFERSIZE> *mSamplesLF;
|
||||
|
||||
alignas(16) ALfloat ChannelMix[BUFFERSIZE];
|
||||
alignas(16) ALfloat mChannelMix[BUFFERSIZE];
|
||||
|
||||
struct {
|
||||
BandSplitter XOver;
|
||||
ALfloat Gains[NumBands];
|
||||
} UpSampler[4];
|
||||
ALfloat Gains[sNumBands];
|
||||
} mUpSampler[4];
|
||||
|
||||
ALsizei NumChannels;
|
||||
ALboolean DualBand;
|
||||
ALsizei mNumChannels;
|
||||
ALboolean mDualBand;
|
||||
|
||||
public:
|
||||
void reset(const AmbDecConf *conf, ALsizei chancount, ALuint srate, const ALsizei (&chanmap)[MAX_OUTPUT_CHANNELS]);
|
||||
|
||||
/* Decodes the ambisonic input to the given output channels. */
|
||||
void process(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei SamplesToDo);
|
||||
|
||||
/* Up-samples a first-order input to the decoder's configuration. */
|
||||
void upSample(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei InChannels, const ALsizei SamplesToDo);
|
||||
|
||||
DEF_NEWDEL(BFormatDec)
|
||||
};
|
||||
|
||||
void bformatdec_reset(BFormatDec *dec, const AmbDecConf *conf, ALsizei chancount, ALuint srate, const ALsizei (&chanmap)[MAX_OUTPUT_CHANNELS]);
|
||||
|
||||
/* Decodes the ambisonic input to the given output channels. */
|
||||
void bformatdec_process(BFormatDec *dec, ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], ALsizei SamplesToDo);
|
||||
|
||||
/* Up-samples a first-order input to the decoder's configuration. */
|
||||
void bformatdec_upSample(BFormatDec *dec, ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], ALsizei InChannels, ALsizei SamplesToDo);
|
||||
|
||||
|
||||
/* Stand-alone first-order upsampler. Kept here because it shares some stuff
|
||||
* with bformatdec. Assumes a periphonic (4-channel) input mix!
|
||||
*/
|
||||
struct AmbiUpsampler {
|
||||
static constexpr size_t NumBands{2};
|
||||
class AmbiUpsampler {
|
||||
public:
|
||||
static constexpr size_t sNumBands{2};
|
||||
|
||||
alignas(16) ALfloat Samples[NumBands][BUFFERSIZE];
|
||||
private:
|
||||
alignas(16) ALfloat mSamples[sNumBands][BUFFERSIZE];
|
||||
|
||||
BandSplitter XOver[4];
|
||||
BandSplitter mXOver[4];
|
||||
|
||||
ALfloat Gains[4][MAX_OUTPUT_CHANNELS][NumBands];
|
||||
ALfloat mGains[4][MAX_OUTPUT_CHANNELS][sNumBands];
|
||||
|
||||
public:
|
||||
void reset(const ALCdevice *device, const ALfloat w_scale, const ALfloat xyz_scale);
|
||||
void process(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei SamplesToDo);
|
||||
|
||||
DEF_NEWDEL(AmbiUpsampler)
|
||||
};
|
||||
|
||||
void ambiup_reset(AmbiUpsampler *ambiup, const ALCdevice *device, ALfloat w_scale, ALfloat xyz_scale);
|
||||
void ambiup_process(AmbiUpsampler *ambiup, ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], ALsizei SamplesToDo);
|
||||
|
||||
#endif /* BFORMATDEC_H */
|
||||
|
||||
+4
-4
@@ -562,7 +562,7 @@ static void InitPanning(ALCdevice *device)
|
||||
w_scale = W_SCALE_2H2P;
|
||||
xyz_scale = XYZ_SCALE_2H2P;
|
||||
}
|
||||
ambiup_reset(device->AmbiUp.get(), device, w_scale, xyz_scale);
|
||||
device->AmbiUp->reset(device, w_scale, xyz_scale);
|
||||
}
|
||||
|
||||
if(ConfigValueFloat(devname, "decoder", "nfc-ref-delay", &nfc_delay) && nfc_delay > 0.0f)
|
||||
@@ -724,7 +724,7 @@ static void InitHQPanning(ALCdevice *device, const AmbDecConf *conf, const ALsiz
|
||||
(conf->ChanMask > 0xf) ? (conf->ChanMask > 0x1ff) ? "third" : "second" : "first",
|
||||
(conf->ChanMask&AMBI_PERIPHONIC_MASK) ? " periphonic" : ""
|
||||
);
|
||||
bformatdec_reset(device->AmbiDecoder.get(), conf, count, device->Frequency, speakermap);
|
||||
device->AmbiDecoder->reset(conf, count, device->Frequency, speakermap);
|
||||
|
||||
if(conf->ChanMask <= 0xf)
|
||||
{
|
||||
@@ -878,8 +878,8 @@ static void InitHrtfPanning(ALCdevice *device)
|
||||
device->FOAOut.CoeffCount = 0;
|
||||
device->FOAOut.NumChannels = 4;
|
||||
|
||||
ambiup_reset(device->AmbiUp.get(), device, AmbiOrderHFGainFOA[0] / AmbiOrderHFGain[0],
|
||||
AmbiOrderHFGainFOA[1] / AmbiOrderHFGain[1]);
|
||||
device->AmbiUp->reset(device, AmbiOrderHFGainFOA[0] / AmbiOrderHFGain[0],
|
||||
AmbiOrderHFGainFOA[1] / AmbiOrderHFGain[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -225,8 +225,8 @@ struct ALeffect;
|
||||
struct ALfilter;
|
||||
struct EffectState;
|
||||
struct Uhj2Encoder;
|
||||
struct BFormatDec;
|
||||
struct AmbiUpsampler;
|
||||
class BFormatDec;
|
||||
class AmbiUpsampler;
|
||||
struct bs2b;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user