aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--alc/effects/convolution.cpp2
-rw-r--r--alc/effects/reverb.cpp2
-rw-r--r--core/ambidefs.cpp26
-rw-r--r--core/ambidefs.h2
-rw-r--r--core/voice.cpp2
5 files changed, 27 insertions, 7 deletions
diff --git a/alc/effects/convolution.cpp b/alc/effects/convolution.cpp
index 196238fc..26a99ef9 100644
--- a/alc/effects/convolution.cpp
+++ b/alc/effects/convolution.cpp
@@ -420,7 +420,7 @@ void ConvolutionState::update(const ContextBase *context, const EffectSlot *slot
if(device->mAmbiOrder > mAmbiOrder)
{
mMix = &ConvolutionState::UpsampleMix;
- const auto scales = AmbiScale::GetHFOrderScales(mAmbiOrder, device->mAmbiOrder);
+ const auto scales = AmbiScale::GetHFOrderScales(mAmbiOrder, device->mAmbiOrder, false);
(*mChans)[0].mHfScale = scales[0];
for(size_t i{1};i < mChans->size();++i)
(*mChans)[i].mHfScale = scales[1];
diff --git a/alc/effects/reverb.cpp b/alc/effects/reverb.cpp
index 71640a87..554fb341 100644
--- a/alc/effects/reverb.cpp
+++ b/alc/effects/reverb.cpp
@@ -686,7 +686,7 @@ void ReverbState::deviceUpdate(const DeviceBase *device, const Buffer&)
if(device->mAmbiOrder > 1)
{
mUpmixOutput = true;
- mOrderScales = AmbiScale::GetHFOrderScales(1, device->mAmbiOrder);
+ mOrderScales = AmbiScale::GetHFOrderScales(1, device->mAmbiOrder, false);
}
else
{
diff --git a/core/ambidefs.cpp b/core/ambidefs.cpp
index 49b2d144..819ba9a6 100644
--- a/core/ambidefs.cpp
+++ b/core/ambidefs.cpp
@@ -29,6 +29,18 @@ constexpr std::array<std::array<float,MaxAmbiOrder+1>,MaxAmbiOrder+1> HFScales{{
/* 1.947005434e+00f, 1.764337084e+00f, 1.424707344e+00f, 9.755104127e-01f, 4.784482742e-01f */
}};
+/* Same as above, but using a 10-point horizontal-only speaker array. Should
+ * only be used when the device is mixing in 2D B-Format for horizontal-only
+ * output.
+ */
+constexpr std::array<std::array<float,MaxAmbiOrder+1>,MaxAmbiOrder+1> HFScales2D{{
+ {{ 2.236067977e+00f, 1.581138830e+00f, 9.128709292e-01f, 6.050756345e-01f }},
+ {{ 2.236067977e+00f, 1.581138830e+00f, 9.128709292e-01f, 6.050756345e-01f }},
+ {{ 1.825741858e+00f, 1.581138830e+00f, 9.128709292e-01f, 6.050756345e-01f }},
+ {{ 1.581138830e+00f, 1.460781803e+00f, 1.118033989e+00f, 6.050756345e-01f }},
+ /* 1.414213562e+00f, 1.344997024e+00f, 1.144122806e+00f, 8.312538756e-01f, 4.370160244e-01f */
+}};
+
constexpr std::array<std::array<float,4>,8> FirstOrderDecoder{{
{{ 1.250000000e-01f, 1.250000000e-01f, 1.250000000e-01f, 1.250000000e-01f, }},
@@ -385,12 +397,20 @@ const std::array<AmbiChannelFloatArray,25> AmbiScale::FourthOrder2DUp{CalcFourth
std::array<float,MaxAmbiOrder+1> AmbiScale::GetHFOrderScales(const uint src_order,
- const uint dev_order) noexcept
+ const uint dev_order, const bool horizontalOnly) noexcept
{
std::array<float,MaxAmbiOrder+1> res{};
- for(size_t i{0};i < MaxAmbiOrder+1;++i)
- res[i] = HFScales[src_order][i] / HFScales[dev_order][i];
+ if(!horizontalOnly)
+ {
+ for(size_t i{0};i < MaxAmbiOrder+1;++i)
+ res[i] = HFScales[src_order][i] / HFScales[dev_order][i];
+ }
+ else
+ {
+ for(size_t i{0};i < MaxAmbiOrder+1;++i)
+ res[i] = HFScales2D[src_order][i] / HFScales2D[dev_order][i];
+ }
return res;
}
diff --git a/core/ambidefs.h b/core/ambidefs.h
index aa69b2e6..b7d2bcd1 100644
--- a/core/ambidefs.h
+++ b/core/ambidefs.h
@@ -115,7 +115,7 @@ struct AmbiScale {
/* Retrieves per-order HF scaling factors for "upsampling" ambisonic data. */
static std::array<float,MaxAmbiOrder+1> GetHFOrderScales(const uint src_order,
- const uint dev_order) noexcept;
+ const uint dev_order, const bool horizontalOnly) noexcept;
static const std::array<std::array<float,MaxAmbiChannels>,4> FirstOrderUp;
static const std::array<std::array<float,MaxAmbiChannels>,4> FirstOrder2DUp;
diff --git a/core/voice.cpp b/core/voice.cpp
index 8b4cabe2..7af35e7a 100644
--- a/core/voice.cpp
+++ b/core/voice.cpp
@@ -899,7 +899,7 @@ void Voice::prepare(DeviceBase *device)
{
const uint8_t *OrderFromChan{Is2DAmbisonic(mFmtChannels) ?
AmbiIndex::OrderFrom2DChannel().data() : AmbiIndex::OrderFromChannel().data()};
- const auto scales = AmbiScale::GetHFOrderScales(mAmbiOrder, device->mAmbiOrder);
+ const auto scales = AmbiScale::GetHFOrderScales(mAmbiOrder, device->mAmbiOrder, false);
const BandSplitter splitter{device->mXOverFreq / static_cast<float>(device->Frequency)};
for(auto &chandata : mChans)