aboutsummaryrefslogtreecommitdiffstats
path: root/alc/panning.cpp
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2021-06-25 08:10:41 -0700
committerChris Robinson <[email protected]>2021-06-25 08:10:41 -0700
commitc09c94de25f5c6bd10e94f7456dbeacbf9f52cb4 (patch)
tree4956317a4114018edc4e6e542aa813814d5d6d5d /alc/panning.cpp
parent2186c890a3a22f9144f7bf8fa4737e13b3459d3e (diff)
Allow decoders to specify the coefficient scaling
Diffstat (limited to 'alc/panning.cpp')
-rw-r--r--alc/panning.cpp30
1 files changed, 24 insertions, 6 deletions
diff --git a/alc/panning.cpp b/alc/panning.cpp
index 9c7e53c7..0ed401a1 100644
--- a/alc/panning.cpp
+++ b/alc/panning.cpp
@@ -147,6 +147,7 @@ struct DecoderConfig<SingleBand, N> {
uint8_t mOrder{};
bool mIs3D{};
std::array<Channel,N> mChannels{};
+ DevAmbiScaling mScaling{};
std::array<float,MaxAmbiOrder+1> mOrderGain{};
std::array<ChannelCoeffs,N> mCoeffs{};
};
@@ -156,6 +157,7 @@ struct DecoderConfig<DualBand, N> {
uint8_t mOrder{};
bool mIs3D{};
std::array<Channel,N> mChannels{};
+ DevAmbiScaling mScaling{};
std::array<float,MaxAmbiOrder+1> mOrderGain{};
std::array<ChannelCoeffs,N> mCoeffs{};
std::array<float,MaxAmbiOrder+1> mOrderGainLF{};
@@ -167,6 +169,7 @@ struct DecoderConfig<DualBand, 0> {
uint8_t mOrder{};
bool mIs3D{};
al::span<const Channel> mChannels;
+ DevAmbiScaling mScaling{};
al::span<const float> mOrderGain;
al::span<const ChannelCoeffs> mCoeffs;
al::span<const float> mOrderGainLF;
@@ -178,6 +181,7 @@ struct DecoderConfig<DualBand, 0> {
mOrder = rhs.mOrder;
mIs3D = rhs.mIs3D;
mChannels = rhs.mChannels;
+ mScaling = rhs.mScaling;
mOrderGain = rhs.mOrderGain;
mCoeffs = rhs.mCoeffs;
mOrderGainLF = {};
@@ -191,6 +195,7 @@ struct DecoderConfig<DualBand, 0> {
mOrder = rhs.mOrder;
mIs3D = rhs.mIs3D;
mChannels = rhs.mChannels;
+ mScaling = rhs.mScaling;
mOrderGain = rhs.mOrderGain;
mCoeffs = rhs.mCoeffs;
mOrderGainLF = rhs.mOrderGainLF;
@@ -312,6 +317,13 @@ DecoderView MakeDecoderView(ALCdevice *device, const AmbDecConf *conf,
(conf->ChanMask > Ambi1OrderMask) ? uint8_t{2} : uint8_t{1};
decoder.mIs3D = (conf->ChanMask&AmbiPeriphonicMask) != 0;
+ switch(conf->CoeffScale)
+ {
+ case AmbDecScale::N3D: decoder.mScaling = DevAmbiScaling::N3D; break;
+ case AmbDecScale::SN3D: decoder.mScaling = DevAmbiScaling::SN3D; break;
+ case AmbDecScale::FuMa: decoder.mScaling = DevAmbiScaling::FuMa; break;
+ }
+
std::copy_n(std::begin(conf->HFOrderGain),
std::min(al::size(conf->HFOrderGain), al::size(decoder.mOrderGain)),
std::begin(decoder.mOrderGain));
@@ -359,7 +371,6 @@ DecoderView MakeDecoderView(ALCdevice *device, const AmbDecConf *conf,
++elem;
}
}
- auto&& coeffscale = GetAmbiScales(conf->CoeffScale);
const auto num_coeffs = static_cast<uint>(al::popcount(conf->ChanMask));
const auto hfmatrix = conf->HFMatrix;
const auto lfmatrix = conf->LFMatrix;
@@ -415,16 +426,14 @@ DecoderView MakeDecoderView(ALCdevice *device, const AmbDecConf *conf,
for(size_t src{0};src < num_coeffs;++src)
{
const size_t dst{idx_map[src]};
- const size_t acn{acnmap[dst]};
- decoder.mCoeffs[chan_count][dst] = hfmatrix[chan_count][src] / coeffscale[acn];
+ decoder.mCoeffs[chan_count][dst] = hfmatrix[chan_count][src];
}
if(conf->FreqBands > 1)
{
for(size_t src{0};src < num_coeffs;++src)
{
const size_t dst{idx_map[src]};
- const size_t acn{acnmap[dst]};
- decoder.mCoeffsLF[chan_count][dst] = lfmatrix[chan_count][src] / coeffscale[acn];
+ decoder.mCoeffsLF[chan_count][dst] = lfmatrix[chan_count][src];
}
}
++chan_count;
@@ -449,11 +458,13 @@ DecoderView MakeDecoderView(ALCdevice *device, const AmbDecConf *conf,
constexpr DecoderConfig<SingleBand, 1> MonoConfig{
0, false, {{FrontCenter}},
+ DevAmbiScaling::N3D,
{{1.0f}},
{{ {{1.0f}} }}
};
constexpr DecoderConfig<SingleBand, 2> StereoConfig{
1, false, {{FrontLeft, FrontRight}},
+ DevAmbiScaling::N3D,
{{1.0f, 1.0f}},
{{
{{5.00000000e-1f, 2.88675135e-1f, 5.52305643e-2f}},
@@ -462,6 +473,7 @@ constexpr DecoderConfig<SingleBand, 2> StereoConfig{
};
constexpr DecoderConfig<DualBand, 4> QuadConfig{
2, false, {{BackLeft, FrontLeft, FrontRight, BackRight}},
+ DevAmbiScaling::N3D,
/*HF*/{{1.15470054e+0f, 1.00000000e+0f, 5.77350269e-1f}},
{{
{{2.50000000e-1f, 2.04124145e-1f, -2.04124145e-1f, -1.29099445e-1f, 0.00000000e+0f}},
@@ -479,6 +491,7 @@ constexpr DecoderConfig<DualBand, 4> QuadConfig{
};
constexpr DecoderConfig<SingleBand, 4> X51Config{
2, false, {{SideLeft, FrontLeft, FrontRight, SideRight}},
+ DevAmbiScaling::N3D,
{{1.0f, 1.0f, 1.0f}},
{{
{{3.33000782e-1f, 1.89084803e-1f, -2.00042375e-1f, -2.12307769e-2f, -1.14579885e-2f}},
@@ -489,6 +502,7 @@ constexpr DecoderConfig<SingleBand, 4> X51Config{
};
constexpr DecoderConfig<SingleBand, 4> X51RearConfig{
2, false, {{BackLeft, FrontLeft, FrontRight, BackRight}},
+ DevAmbiScaling::N3D,
{{1.0f, 1.0f, 1.0f}},
{{
{{3.33000782e-1f, 1.89084803e-1f, -2.00042375e-1f, -2.12307769e-2f, -1.14579885e-2f}},
@@ -499,6 +513,7 @@ constexpr DecoderConfig<SingleBand, 4> X51RearConfig{
};
constexpr DecoderConfig<SingleBand, 5> X61Config{
2, false, {{SideLeft, FrontLeft, FrontRight, SideRight, BackCenter}},
+ DevAmbiScaling::N3D,
{{1.0f, 1.0f, 1.0f}},
{{
{{2.04460341e-1f, 2.17177926e-1f, -4.39996780e-2f, -2.60790269e-2f, -6.87239792e-2f}},
@@ -510,6 +525,7 @@ constexpr DecoderConfig<SingleBand, 5> X61Config{
};
constexpr DecoderConfig<DualBand, 6> X71Config{
3, false, {{BackLeft, SideLeft, FrontLeft, FrontRight, SideRight, BackRight}},
+ DevAmbiScaling::N3D,
/*HF*/{{1.22474487e+0f, 1.13151672e+0f, 8.66025404e-1f, 4.68689571e-1f}},
{{
{{1.66666667e-1f, 9.62250449e-2f, -1.66666667e-1f, -1.49071198e-1f, 8.60662966e-2f, 7.96819073e-2f, 0.00000000e+0f}},
@@ -609,8 +625,10 @@ void InitPanning(ALCdevice *device, const bool hqdec=false, const bool stablize=
Ambi2DChannelsFromOrder(decoder.mOrder)};
const al::span<const uint8_t> acnmap{decoder.mIs3D ? AmbiIndex::FromACN().data() :
AmbiIndex::FromACN2D().data(), ambicount};
+ auto&& coeffscale = GetAmbiScales(decoder.mScaling);
std::transform(acnmap.begin(), acnmap.end(), std::begin(device->Dry.AmbiMap),
- [](const uint8_t &index) noexcept { return BFChannelConfig{1.0f, index}; });
+ [&coeffscale](const uint8_t &acn) noexcept
+ { return BFChannelConfig{1.0f/coeffscale[acn], acn}; });
AllocChannels(device, ambicount, device->channelsFromFmt());
std::unique_ptr<FrontStablizer> stablizer;