aboutsummaryrefslogtreecommitdiffstats
path: root/alc/bformatdec.h
diff options
context:
space:
mode:
Diffstat (limited to 'alc/bformatdec.h')
-rw-r--r--alc/bformatdec.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/alc/bformatdec.h b/alc/bformatdec.h
new file mode 100644
index 00000000..06974651
--- /dev/null
+++ b/alc/bformatdec.h
@@ -0,0 +1,62 @@
+#ifndef BFORMATDEC_H
+#define BFORMATDEC_H
+
+#include <array>
+#include <cstddef>
+
+#include "AL/al.h"
+
+#include "alcmain.h"
+#include "almalloc.h"
+#include "alspan.h"
+#include "ambidefs.h"
+#include "filters/splitter.h"
+#include "vector.h"
+
+struct AmbDecConf;
+
+
+using ChannelDec = ALfloat[MAX_AMBI_CHANNELS];
+
+class BFormatDec {
+ static constexpr size_t sHFBand{0};
+ static constexpr size_t sLFBand{1};
+ static constexpr size_t sNumBands{2};
+
+ ALuint mEnabled{0u}; /* Bitfield of enabled channels. */
+
+ union MatrixU {
+ ALfloat Dual[MAX_OUTPUT_CHANNELS][sNumBands][MAX_AMBI_CHANNELS];
+ ALfloat Single[MAX_OUTPUT_CHANNELS][MAX_AMBI_CHANNELS];
+ } mMatrix{};
+
+ /* NOTE: BandSplitter filters are unused with single-band decoding */
+ BandSplitter mXOver[MAX_AMBI_CHANNELS];
+
+ al::vector<FloatBufferLine, 16> mSamples;
+ /* These two alias into Samples */
+ FloatBufferLine *mSamplesHF{nullptr};
+ FloatBufferLine *mSamplesLF{nullptr};
+
+ ALuint mNumChannels{0u};
+ bool mDualBand{false};
+
+public:
+ BFormatDec(const AmbDecConf *conf, const bool allow_2band, const ALuint inchans,
+ const ALuint srate, const ALsizei (&chanmap)[MAX_OUTPUT_CHANNELS]);
+ BFormatDec(const ALuint inchans, const ALsizei chancount,
+ const ChannelDec (&chancoeffs)[MAX_OUTPUT_CHANNELS],
+ const ALsizei (&chanmap)[MAX_OUTPUT_CHANNELS]);
+
+ /* Decodes the ambisonic input to the given output channels. */
+ void process(const al::span<FloatBufferLine> OutBuffer, const FloatBufferLine *InSamples,
+ const ALsizei SamplesToDo);
+
+ /* Retrieves per-order HF scaling factors for "upsampling" ambisonic data. */
+ static std::array<ALfloat,MAX_AMBI_ORDER+1> GetHFOrderScales(const ALsizei in_order,
+ const ALsizei out_order) noexcept;
+
+ DEF_NEWDEL(BFormatDec)
+};
+
+#endif /* BFORMATDEC_H */