aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/bformatdec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Alc/bformatdec.cpp')
-rw-r--r--Alc/bformatdec.cpp111
1 files changed, 30 insertions, 81 deletions
diff --git a/Alc/bformatdec.cpp b/Alc/bformatdec.cpp
index 888c7cab..322a7977 100644
--- a/Alc/bformatdec.cpp
+++ b/Alc/bformatdec.cpp
@@ -59,8 +59,7 @@ constexpr ALfloat Ambi3DDecoderHFScale[MAX_AMBI_COEFFS] = {
#define INVALID_UPSAMPLE_INDEX INT_MAX
ALsizei GetACNIndex(const BFChannelConfig *chans, ALsizei numchans, ALsizei acn)
{
- ALsizei i;
- for(i = 0;i < numchans;i++)
+ for(ALsizei i{0};i < numchans;i++)
{
if(chans[i].Index == acn)
return i;
@@ -69,7 +68,7 @@ ALsizei GetACNIndex(const BFChannelConfig *chans, ALsizei numchans, ALsizei acn)
}
#define GetChannelForACN(b, a) GetACNIndex((b).Ambi.Map, (b).NumChannels, (a))
-auto GetAmbiScales(AmbDecScale scaletype) noexcept -> decltype(AmbiScale::N3D2N3D)&
+auto GetAmbiScales(AmbDecScale scaletype) noexcept -> const float(&)[MAX_AMBI_COEFFS]
{
if(scaletype == AmbDecScale::FuMa) return AmbiScale::FuMa2N3D;
if(scaletype == AmbDecScale::SN3D) return AmbiScale::SN3D2N3D;
@@ -88,9 +87,9 @@ void BFormatDec::reset(const AmbDecConf *conf, ALsizei chancount, ALuint srate,
mSamplesLF = nullptr;
mNumChannels = chancount;
- mSamples.resize(mNumChannels * 2);
+ mSamples.resize(chancount * 2);
mSamplesHF = mSamples.data();
- mSamplesLF = mSamplesHF + mNumChannels;
+ mSamplesLF = mSamplesHF + chancount;
mEnabled = std::accumulate(std::begin(chanmap), std::begin(chanmap)+conf->NumSpeakers, 0u,
[](ALuint mask, const ALsizei &chan) noexcept -> ALuint
@@ -129,100 +128,50 @@ void BFormatDec::reset(const AmbDecConf *conf, ALsizei chancount, ALuint srate,
mUpSampler[3].Gains[LF_BAND] = 0.0f;
}
- const ALfloat (&coeff_scale)[MAX_AMBI_COEFFS] = GetAmbiScales(conf->CoeffScale);
+ const float (&coeff_scale)[MAX_AMBI_COEFFS] = GetAmbiScales(conf->CoeffScale);
+ const ALsizei coeff_count{periphonic ? MAX_AMBI_COEFFS : MAX_AMBI2D_COEFFS};
mMatrix = MatrixU{};
- if(conf->FreqBands == 1)
+ mDualBand = (conf->FreqBands == 2);
+ if(!mDualBand)
{
- mDualBand = AL_FALSE;
for(ALsizei i{0};i < conf->NumSpeakers;i++)
{
- const ALsizei chan{chanmap[i]};
- if(!periphonic)
+ ALfloat (&mtx)[MAX_AMBI_COEFFS] = mMatrix.Single[chanmap[i]];
+ for(ALsizei j{0},k{0};j < coeff_count;j++)
{
- ALfloat gain{conf->HFOrderGain[0]};
- for(ALsizei j{0},k{0};j < MAX_AMBI2D_COEFFS;j++)
- {
- const ALsizei l{map2DTo3D[j]};
- if(j == 1) gain = conf->HFOrderGain[1];
- else if(j == 3) gain = conf->HFOrderGain[2];
- else if(j == 5) gain = conf->HFOrderGain[3];
- if((conf->ChanMask&(1<<l)))
- mMatrix.Single[chan][j] = conf->HFMatrix[i][k++] / coeff_scale[l] * gain;
- }
- }
- else
- {
- ALfloat gain{conf->HFOrderGain[0]};
- for(ALsizei j{0},k{0};j < MAX_AMBI_COEFFS;j++)
- {
- if(j == 1) gain = conf->HFOrderGain[1];
- else if(j == 4) gain = conf->HFOrderGain[2];
- else if(j == 9) gain = conf->HFOrderGain[3];
- if((conf->ChanMask&(1<<j)))
- mMatrix.Single[chan][j] = conf->HFMatrix[i][k++] / coeff_scale[j] * gain;
- }
+ const ALsizei l{periphonic ? j : map2DTo3D[j]};
+ if(!(conf->ChanMask&(1<<l))) continue;
+ mtx[j] = conf->HFMatrix[i][k] / coeff_scale[l] *
+ ((l>=9) ? conf->HFOrderGain[3] :
+ (l>=4) ? conf->HFOrderGain[2] :
+ (l>=1) ? conf->HFOrderGain[1] : conf->HFOrderGain[0]);
+ ++k;
}
}
}
else
{
- mDualBand = AL_TRUE;
-
mXOver[0].init(conf->XOverFreq / (float)srate);
std::fill(std::begin(mXOver)+1, std::end(mXOver), mXOver[0]);
const float ratio{std::pow(10.0f, conf->XOverRatio / 40.0f)};
for(ALsizei i{0};i < conf->NumSpeakers;i++)
{
- const ALsizei chan{chanmap[i]};
- if(!periphonic)
- {
- ALfloat gain{conf->HFOrderGain[0] * ratio};
- for(ALsizei j{0},k{0};j < MAX_AMBI2D_COEFFS;j++)
- {
- ALsizei l = map2DTo3D[j];
- if(j == 1) gain = conf->HFOrderGain[1] * ratio;
- else if(j == 3) gain = conf->HFOrderGain[2] * ratio;
- else if(j == 5) gain = conf->HFOrderGain[3] * ratio;
- if((conf->ChanMask&(1<<l)))
- mMatrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] / coeff_scale[l] *
- gain;
- }
- gain = conf->HFOrderGain[0] / ratio;
- for(ALsizei j{0},k{0};j < MAX_AMBI2D_COEFFS;j++)
- {
- ALsizei l = map2DTo3D[j];
- if(j == 1) gain = conf->LFOrderGain[1] / ratio;
- else if(j == 3) gain = conf->LFOrderGain[2] / ratio;
- else if(j == 5) gain = conf->LFOrderGain[3] / ratio;
- if((conf->ChanMask&(1<<l)))
- mMatrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] / coeff_scale[l] *
- gain;
- }
- }
- else
+ ALfloat (&mtx)[sNumBands][MAX_AMBI_COEFFS] = mMatrix.Dual[chanmap[i]];
+ for(ALsizei j{0},k{0};j < coeff_count;j++)
{
- ALfloat gain{conf->HFOrderGain[0] * ratio};
- for(ALsizei j{0},k{0};j < MAX_AMBI_COEFFS;j++)
- {
- if(j == 1) gain = conf->HFOrderGain[1] * ratio;
- else if(j == 4) gain = conf->HFOrderGain[2] * ratio;
- else if(j == 9) gain = conf->HFOrderGain[3] * ratio;
- if((conf->ChanMask&(1<<j)))
- mMatrix.Dual[chan][HF_BAND][j] = conf->HFMatrix[i][k++] / coeff_scale[j] *
- gain;
- }
- gain = conf->HFOrderGain[0] / ratio;
- for(ALsizei j{0},k{0};j < MAX_AMBI_COEFFS;j++)
- {
- if(j == 1) gain = conf->LFOrderGain[1] / ratio;
- else if(j == 4) gain = conf->LFOrderGain[2] / ratio;
- else if(j == 9) gain = conf->LFOrderGain[3] / ratio;
- if((conf->ChanMask&(1<<j)))
- mMatrix.Dual[chan][LF_BAND][j] = conf->LFMatrix[i][k++] / coeff_scale[j] *
- gain;
- }
+ const ALsizei l{periphonic ? j : map2DTo3D[j]};
+ if(!(conf->ChanMask&(1<<l))) continue;
+ mtx[HF_BAND][j] = conf->HFMatrix[i][k] / coeff_scale[l] *
+ ((l>=9) ? conf->HFOrderGain[3] :
+ (l>=4) ? conf->HFOrderGain[2] :
+ (l>=1) ? conf->HFOrderGain[1] : conf->HFOrderGain[0]) * ratio;
+ mtx[LF_BAND][j] = conf->LFMatrix[i][k] / coeff_scale[l] *
+ ((l>=9) ? conf->LFOrderGain[3] :
+ (l>=4) ? conf->LFOrderGain[2] :
+ (l>=1) ? conf->LFOrderGain[1] : conf->LFOrderGain[0]) / ratio;
+ ++k;
}
}
}