diff options
author | Chris Robinson <[email protected]> | 2021-04-25 18:08:08 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2021-04-25 18:08:08 -0700 |
commit | 2479483645bf719233fa5d39bc91682f12d71350 (patch) | |
tree | de4d9f11e4d4549adc6e7a43b9c4a1d630f91feb /core/bformatdec.h | |
parent | 8d09d03ed363ab1735b1933588d8242ba85ddf10 (diff) |
Move bformatdec to core
Diffstat (limited to 'core/bformatdec.h')
-rw-r--r-- | core/bformatdec.h | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/core/bformatdec.h b/core/bformatdec.h new file mode 100644 index 00000000..a0ae3f27 --- /dev/null +++ b/core/bformatdec.h @@ -0,0 +1,71 @@ +#ifndef CORE_BFORMATDEC_H +#define CORE_BFORMATDEC_H + +#include <array> +#include <cstddef> +#include <memory> + +#include "almalloc.h" +#include "alspan.h" +#include "ambidefs.h" +#include "bufferline.h" +#include "devformat.h" +#include "filters/splitter.h" + +struct AmbDecConf; +struct FrontStablizer; + + +using ChannelDec = std::array<float,MaxAmbiChannels>; + +class BFormatDec { + static constexpr size_t sHFBand{0}; + static constexpr size_t sLFBand{1}; + static constexpr size_t sNumBands{2}; + + struct ChannelDecoder { + union MatrixU { + float Dual[sNumBands][MAX_OUTPUT_CHANNELS]; + float Single[MAX_OUTPUT_CHANNELS]; + } mGains{}; + + /* NOTE: BandSplitter filter is unused with single-band decoding. */ + BandSplitter mXOver; + }; + + alignas(16) std::array<FloatBufferLine,2> mSamples; + + const std::unique_ptr<FrontStablizer> mStablizer; + const bool mDualBand{false}; + + al::FlexArray<ChannelDecoder> mChannelDec; + +public: + BFormatDec(const AmbDecConf *conf, const bool allow_2band, const size_t inchans, + const uint srate, const uint (&chanmap)[MAX_OUTPUT_CHANNELS], + std::unique_ptr<FrontStablizer> stablizer); + BFormatDec(const size_t inchans, const al::span<const ChannelDec> coeffs, + const al::span<const ChannelDec> coeffslf, std::unique_ptr<FrontStablizer> stablizer); + + bool hasStablizer() const noexcept { return mStablizer != nullptr; }; + + /* Decodes the ambisonic input to the given output channels. */ + void process(const al::span<FloatBufferLine> OutBuffer, const FloatBufferLine *InSamples, + const size_t SamplesToDo); + + /* Decodes the ambisonic input to the given output channels with stablization. */ + void processStablize(const al::span<FloatBufferLine> OutBuffer, + const FloatBufferLine *InSamples, const size_t lidx, const size_t ridx, const size_t cidx, + const size_t SamplesToDo); + + static std::unique_ptr<BFormatDec> Create(const AmbDecConf *conf, const bool allow_2band, + const size_t inchans, const uint srate, const uint (&chanmap)[MAX_OUTPUT_CHANNELS], + std::unique_ptr<FrontStablizer> stablizer); + static std::unique_ptr<BFormatDec> Create(const size_t inchans, + const al::span<const ChannelDec> coeffs, const al::span<const ChannelDec> coeffslf, + std::unique_ptr<FrontStablizer> stablizer); + + DEF_FAM_NEWDEL(BFormatDec, mChannelDec) +}; + +#endif /* CORE_BFORMATDEC_H */ |