aboutsummaryrefslogtreecommitdiffstats
path: root/alc
diff options
context:
space:
mode:
Diffstat (limited to 'alc')
-rw-r--r--alc/panning.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/alc/panning.cpp b/alc/panning.cpp
index daf1b9ea..b158caff 100644
--- a/alc/panning.cpp
+++ b/alc/panning.cpp
@@ -314,7 +314,7 @@ inline auto& GetAmbiLayout(DevAmbiLayout layouttype) noexcept
}
-using ChannelCoeffs = std::array<float,MaxAmbi2DChannels>;
+using ChannelCoeffs = std::array<float,MaxAmbiChannels>;
enum DecoderMode : bool {
SingleBand = false,
DualBand = true
@@ -325,7 +325,8 @@ struct DecoderConfig;
template<size_t N>
struct DecoderConfig<SingleBand, N> {
- uint mOrder;
+ uint8_t mOrder;
+ bool mIs3D;
std::array<Channel,N> mChannels;
std::array<float,MaxAmbiOrder+1> mOrderGain;
std::array<ChannelCoeffs,N> mCoeffs;
@@ -333,7 +334,8 @@ struct DecoderConfig<SingleBand, N> {
template<size_t N>
struct DecoderConfig<DualBand, N> {
- uint mOrder;
+ uint8_t mOrder;
+ bool mIs3D;
std::array<Channel,N> mChannels;
std::array<float,MaxAmbiOrder+1> mOrderGain;
std::array<ChannelCoeffs,N> mCoeffs;
@@ -343,7 +345,8 @@ struct DecoderConfig<DualBand, N> {
template<>
struct DecoderConfig<DualBand, 0> {
- uint mOrder;
+ uint8_t mOrder;
+ bool mIs3D;
al::span<const Channel> mChannels;
al::span<const float> mOrderGain;
al::span<const ChannelCoeffs> mCoeffs;
@@ -354,6 +357,7 @@ struct DecoderConfig<DualBand, 0> {
DecoderConfig& operator=(const DecoderConfig<SingleBand,N> &rhs) noexcept
{
mOrder = rhs.mOrder;
+ mIs3D = rhs.mIs3D;
mChannels = rhs.mChannels;
mOrderGain = rhs.mOrderGain;
mCoeffs = rhs.mCoeffs;
@@ -366,6 +370,7 @@ struct DecoderConfig<DualBand, 0> {
DecoderConfig& operator=(const DecoderConfig<DualBand,N> &rhs) noexcept
{
mOrder = rhs.mOrder;
+ mIs3D = rhs.mIs3D;
mChannels = rhs.mChannels;
mOrderGain = rhs.mOrderGain;
mCoeffs = rhs.mCoeffs;
@@ -377,12 +382,12 @@ struct DecoderConfig<DualBand, 0> {
using DecoderView = DecoderConfig<DualBand, 0>;
constexpr DecoderConfig<SingleBand, 1> MonoConfig{
- 0, {{FrontCenter}},
+ 0, false, {{FrontCenter}},
{{1.0f}},
{{ {{1.0f}} }}
};
constexpr DecoderConfig<SingleBand, 2> StereoConfig{
- 1, {{FrontLeft, FrontRight}},
+ 1, false, {{FrontLeft, FrontRight}},
{{1.0f, 1.0f}},
{{
{{5.00000000e-1f, 2.88675135e-1f, 5.52305643e-2f}},
@@ -390,7 +395,7 @@ constexpr DecoderConfig<SingleBand, 2> StereoConfig{
}}
};
constexpr DecoderConfig<DualBand, 4> QuadConfig{
- 2, {{BackLeft, FrontLeft, FrontRight, BackRight}},
+ 2, false, {{BackLeft, FrontLeft, FrontRight, BackRight}},
/*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}},
@@ -407,7 +412,7 @@ constexpr DecoderConfig<DualBand, 4> QuadConfig{
}}
};
constexpr DecoderConfig<SingleBand, 4> X51Config{
- 2, {{SideLeft, FrontLeft, FrontRight, SideRight}},
+ 2, false, {{SideLeft, FrontLeft, FrontRight, SideRight}},
{{1.0f, 1.0f, 1.0f}},
{{
{{3.33000782e-1f, 1.89084803e-1f, -2.00042375e-1f, -2.12307769e-2f, -1.14579885e-2f}},
@@ -417,7 +422,7 @@ constexpr DecoderConfig<SingleBand, 4> X51Config{
}}
};
constexpr DecoderConfig<SingleBand, 4> X51RearConfig{
- 2, {{BackLeft, FrontLeft, FrontRight, BackRight}},
+ 2, false, {{BackLeft, FrontLeft, FrontRight, BackRight}},
{{1.0f, 1.0f, 1.0f}},
{{
{{3.33000782e-1f, 1.89084803e-1f, -2.00042375e-1f, -2.12307769e-2f, -1.14579885e-2f}},
@@ -427,7 +432,7 @@ constexpr DecoderConfig<SingleBand, 4> X51RearConfig{
}}
};
constexpr DecoderConfig<SingleBand, 5> X61Config{
- 2, {{SideLeft, FrontLeft, FrontRight, SideRight, BackCenter}},
+ 2, false, {{SideLeft, FrontLeft, FrontRight, SideRight, BackCenter}},
{{1.0f, 1.0f, 1.0f}},
{{
{{2.04460341e-1f, 2.17177926e-1f, -4.39996780e-2f, -2.60790269e-2f, -6.87239792e-2f}},
@@ -438,7 +443,7 @@ constexpr DecoderConfig<SingleBand, 5> X61Config{
}}
};
constexpr DecoderConfig<DualBand, 6> X71Config{
- 3, {{BackLeft, SideLeft, FrontLeft, FrontRight, SideRight, BackRight}},
+ 3, false, {{BackLeft, SideLeft, FrontLeft, FrontRight, SideRight, BackRight}},
/*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}},
@@ -522,7 +527,8 @@ void InitPanning(ALCdevice *device, const bool hqdec=false, const bool stablize=
for(uint o{0};o < decoder.mOrder+1;++o)
{
const float order_gain{decoder.mOrderGain[o]};
- const size_t order_max{Ambi2DChannelsFromOrder(o)};
+ const size_t order_max{decoder.mIs3D ? AmbiChannelsFromOrder(o) :
+ Ambi2DChannelsFromOrder(o)};
for(;ambichan < order_max;++ambichan)
coeffs[ambichan] = decoder.mCoeffs[i][ambichan] * order_gain;
}
@@ -535,7 +541,8 @@ void InitPanning(ALCdevice *device, const bool hqdec=false, const bool stablize=
for(uint o{0};o < decoder.mOrder+1;++o)
{
const float order_gain{decoder.mOrderGainLF[o]};
- const size_t order_max{Ambi2DChannelsFromOrder(o)};
+ const size_t order_max{decoder.mIs3D ? AmbiChannelsFromOrder(o) :
+ Ambi2DChannelsFromOrder(o)};
for(;ambichan < order_max;++ambichan)
coeffs[ambichan] = decoder.mCoeffsLF[i][ambichan] * order_gain;
}
@@ -544,10 +551,11 @@ void InitPanning(ALCdevice *device, const bool hqdec=false, const bool stablize=
/* For non-DevFmtAmbi3D, set the ambisonic order. */
device->mAmbiOrder = decoder.mOrder;
- /* Built-in speaker decoders are always 2D. */
- const size_t ambicount{Ambi2DChannelsFromOrder(decoder.mOrder)};
- std::transform(AmbiIndex::FromACN2D().begin(), AmbiIndex::FromACN2D().begin()+ambicount,
- std::begin(device->Dry.AmbiMap),
+ const size_t ambicount{decoder.mIs3D ? AmbiChannelsFromOrder(decoder.mOrder) :
+ Ambi2DChannelsFromOrder(decoder.mOrder)};
+ const al::span<const uint8_t> acnmap{decoder.mIs3D ? AmbiIndex::FromACN().data() :
+ AmbiIndex::FromACN2D().data(), ambicount};
+ std::transform(acnmap.begin(), acnmap.end(), std::begin(device->Dry.AmbiMap),
[](const uint8_t &index) noexcept { return BFChannelConfig{1.0f, index}; });
AllocChannels(device, ambicount, device->channelsFromFmt());
@@ -580,7 +588,7 @@ void InitPanning(ALCdevice *device, const bool hqdec=false, const bool stablize=
!dual_band ? "single" : "dual",
(decoder.mOrder > 2) ? "third" :
(decoder.mOrder > 1) ? "second" : "first",
- "");
+ decoder.mIs3D ? " periphonic" : "");
device->AmbiDecoder = BFormatDec::Create(ambicount, chancoeffs, chancoeffslf,
std::move(stablizer));
}