aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--alc/bformatdec.h15
-rw-r--r--alc/panning.cpp11
2 files changed, 19 insertions, 7 deletions
diff --git a/alc/bformatdec.h b/alc/bformatdec.h
index d3380616..980c907a 100644
--- a/alc/bformatdec.h
+++ b/alc/bformatdec.h
@@ -3,6 +3,7 @@
#include <array>
#include <cstddef>
+#include <memory>
#include "AL/al.h"
@@ -12,7 +13,6 @@
#include "ambidefs.h"
#include "devformat.h"
#include "filters/splitter.h"
-#include "vector.h"
struct AmbDecConf;
@@ -54,6 +54,19 @@ public:
static std::array<float,MAX_AMBI_ORDER+1> GetHFOrderScales(const ALuint in_order,
const ALuint out_order) noexcept;
+ static std::unique_ptr<BFormatDec> Create(const AmbDecConf *conf, const bool allow_2band,
+ const ALuint inchans, const ALuint srate, const ALuint (&chanmap)[MAX_OUTPUT_CHANNELS])
+ {
+ return std::unique_ptr<BFormatDec>{new(FamCount{inchans})
+ BFormatDec{conf, allow_2band, inchans, srate, chanmap}};
+ }
+ static std::unique_ptr<BFormatDec> Create(const ALuint inchans,
+ const ChannelDec (&chancoeffs)[MAX_OUTPUT_CHANNELS], const al::span<const ALuint> chanmap)
+ {
+ return std::unique_ptr<BFormatDec>{new(FamCount{inchans})
+ BFormatDec{inchans, chancoeffs, chanmap}};
+ }
+
DEF_FAM_NEWDEL(BFormatDec, mChannelDec)
};
diff --git a/alc/panning.cpp b/alc/panning.cpp
index d6f426f3..f7dfa6d0 100644
--- a/alc/panning.cpp
+++ b/alc/panning.cpp
@@ -464,8 +464,8 @@ void InitPanning(ALCdevice *device)
(coeffcount > 5) ? "third" :
(coeffcount > 3) ? "second" : "first",
"");
- device->AmbiDecoder.reset(new(FamCount{coeffcount}) BFormatDec{coeffcount, chancoeffs,
- al::span<const ALuint>{idxmap, chanmap.size()}});
+ device->AmbiDecoder = BFormatDec::Create(coeffcount, chancoeffs,
+ al::span<const ALuint>{idxmap, chanmap.size()});
}
}
@@ -505,14 +505,13 @@ void InitCustomPanning(ALCdevice *device, bool hqdec, const AmbDecConf *conf,
(conf->ChanMask > AMBI_1ORDER_MASK) ? "second" : "first",
(conf->ChanMask&AMBI_PERIPHONIC_MASK) ? " periphonic" : ""
);
- device->AmbiDecoder.reset(new(FamCount{count}) BFormatDec{conf, hqdec, count,
- device->Frequency, speakermap});
+ device->AmbiDecoder = BFormatDec::Create(conf, hqdec, count, device->Frequency, speakermap);
auto accum_spkr_dist = std::bind(std::plus<float>{}, _1,
std::bind(std::mem_fn(&AmbDecConf::SpeakerConf::Distance), _2));
- const ALfloat avg_dist{
+ const float avg_dist{
std::accumulate(conf->Speakers.begin(), conf->Speakers.end(), 0.0f, accum_spkr_dist) /
- static_cast<ALfloat>(conf->Speakers.size())};
+ static_cast<float>(conf->Speakers.size())};
InitNearFieldCtrl(device, avg_dist, order, !!(conf->ChanMask&AMBI_PERIPHONIC_MASK));
InitDistanceComp(device, conf, speakermap);