2016-03-15 05:08:05 -07:00
|
|
|
#ifndef BFORMATDEC_H
|
|
|
|
#define BFORMATDEC_H
|
|
|
|
|
|
|
|
#include "alMain.h"
|
2018-11-22 05:37:35 -08:00
|
|
|
#include "filters/splitter.h"
|
|
|
|
#include "almalloc.h"
|
|
|
|
|
|
|
|
|
|
|
|
struct AmbDecConf;
|
2016-03-15 05:08:05 -07:00
|
|
|
|
2017-01-24 19:03:51 -08:00
|
|
|
|
|
|
|
/* These are the necessary scales for first-order HF responses to play over
|
|
|
|
* higher-order 2D (non-periphonic) decoders.
|
|
|
|
*/
|
2018-02-09 18:43:34 -08:00
|
|
|
#define W_SCALE_2H0P 1.224744871f /* sqrt(1.5) */
|
|
|
|
#define XYZ_SCALE_2H0P 1.0f
|
|
|
|
#define W_SCALE_3H0P 1.414213562f /* sqrt(2) */
|
|
|
|
#define XYZ_SCALE_3H0P 1.082392196f
|
2017-01-24 19:03:51 -08:00
|
|
|
|
|
|
|
/* These are the necessary scales for first-order HF responses to play over
|
|
|
|
* higher-order 3D (periphonic) decoders.
|
|
|
|
*/
|
2018-02-09 18:43:34 -08:00
|
|
|
#define W_SCALE_2H2P 1.341640787f /* sqrt(1.8) */
|
|
|
|
#define XYZ_SCALE_2H2P 1.0f
|
|
|
|
#define W_SCALE_3H3P 1.695486018f
|
|
|
|
#define XYZ_SCALE_3H3P 1.136697713f
|
2017-01-24 19:03:51 -08:00
|
|
|
|
|
|
|
|
2018-02-13 13:47:35 -08:00
|
|
|
/* NOTE: These are scale factors as applied to Ambisonics content. Decoder
|
|
|
|
* coefficients should be divided by these values to get proper N3D scalings.
|
|
|
|
*/
|
2018-11-03 15:32:09 -07:00
|
|
|
extern const ALfloat N3D2N3DScale[MAX_AMBI_COEFFS];
|
|
|
|
extern const ALfloat SN3D2N3DScale[MAX_AMBI_COEFFS];
|
|
|
|
extern const ALfloat FuMa2N3DScale[MAX_AMBI_COEFFS];
|
2018-02-13 13:47:35 -08:00
|
|
|
|
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
class BFormatDec {
|
|
|
|
public:
|
|
|
|
static constexpr size_t sNumBands{2};
|
2018-11-22 05:37:35 -08:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
private:
|
|
|
|
ALuint mEnabled; /* Bitfield of enabled channels. */
|
2018-11-22 05:37:35 -08:00
|
|
|
|
|
|
|
union {
|
2018-12-08 02:50:34 -08:00
|
|
|
alignas(16) ALfloat Dual[MAX_OUTPUT_CHANNELS][sNumBands][MAX_AMBI_COEFFS];
|
2018-11-22 05:37:35 -08:00
|
|
|
alignas(16) ALfloat Single[MAX_OUTPUT_CHANNELS][MAX_AMBI_COEFFS];
|
2018-12-08 02:50:34 -08:00
|
|
|
} mMatrix;
|
2018-11-22 05:37:35 -08:00
|
|
|
|
|
|
|
/* NOTE: BandSplitter filters are unused with single-band decoding */
|
2018-12-08 02:50:34 -08:00
|
|
|
BandSplitter mXOver[MAX_AMBI_COEFFS];
|
2016-03-15 05:08:05 -07:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
al::vector<std::array<ALfloat,BUFFERSIZE>, 16> mSamples;
|
2018-11-22 05:37:35 -08:00
|
|
|
/* These two alias into Samples */
|
2018-12-08 02:50:34 -08:00
|
|
|
std::array<ALfloat,BUFFERSIZE> *mSamplesHF;
|
|
|
|
std::array<ALfloat,BUFFERSIZE> *mSamplesLF;
|
2016-03-26 17:52:42 -07:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
alignas(16) ALfloat mChannelMix[BUFFERSIZE];
|
2018-11-22 05:37:35 -08:00
|
|
|
|
|
|
|
struct {
|
|
|
|
BandSplitter XOver;
|
2018-12-08 02:50:34 -08:00
|
|
|
ALfloat Gains[sNumBands];
|
|
|
|
} mUpSampler[4];
|
2018-11-22 05:37:35 -08:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
ALsizei mNumChannels;
|
|
|
|
ALboolean mDualBand;
|
2018-11-22 05:37:35 -08:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
public:
|
|
|
|
void reset(const AmbDecConf *conf, ALsizei chancount, ALuint srate, const ALsizei (&chanmap)[MAX_OUTPUT_CHANNELS]);
|
2018-11-22 05:37:35 -08:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
/* Decodes the ambisonic input to the given output channels. */
|
|
|
|
void process(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei SamplesToDo);
|
2016-03-23 12:53:36 -07:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
/* Up-samples a first-order input to the decoder's configuration. */
|
|
|
|
void upSample(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei InChannels, const ALsizei SamplesToDo);
|
2016-03-15 05:08:05 -07:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
DEF_NEWDEL(BFormatDec)
|
|
|
|
};
|
2016-03-23 12:53:36 -07:00
|
|
|
|
2016-08-21 03:05:42 -07:00
|
|
|
|
2016-07-30 09:29:21 -07:00
|
|
|
/* Stand-alone first-order upsampler. Kept here because it shares some stuff
|
2018-02-13 03:03:26 -08:00
|
|
|
* with bformatdec. Assumes a periphonic (4-channel) input mix!
|
2016-07-30 09:29:21 -07:00
|
|
|
*/
|
2018-12-08 02:50:34 -08:00
|
|
|
class AmbiUpsampler {
|
|
|
|
public:
|
|
|
|
static constexpr size_t sNumBands{2};
|
|
|
|
|
|
|
|
private:
|
|
|
|
alignas(16) ALfloat mSamples[sNumBands][BUFFERSIZE];
|
2018-11-22 05:37:35 -08:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
BandSplitter mXOver[4];
|
2018-11-22 05:37:35 -08:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
ALfloat mGains[4][MAX_OUTPUT_CHANNELS][sNumBands];
|
2018-11-22 05:37:35 -08:00
|
|
|
|
2018-12-08 02:50:34 -08:00
|
|
|
public:
|
|
|
|
void reset(const ALCdevice *device, const ALfloat w_scale, const ALfloat xyz_scale);
|
|
|
|
void process(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei SamplesToDo);
|
2016-07-30 09:29:21 -07:00
|
|
|
|
2018-11-22 05:37:35 -08:00
|
|
|
DEF_NEWDEL(AmbiUpsampler)
|
|
|
|
};
|
2016-07-30 09:29:21 -07:00
|
|
|
|
2016-03-15 05:08:05 -07:00
|
|
|
#endif /* BFORMATDEC_H */
|