Move some ambisonic-related macros to a separate header

This commit is contained in:
Chris Robinson
2018-12-15 03:30:47 -08:00
parent 0dd13a9dfe
commit e0f635b20d
6 changed files with 58 additions and 47 deletions
+6 -1
View File
@@ -12,11 +12,16 @@
#include <fstream>
#include <sstream>
#include "logging.h"
#include "compat.h"
namespace {
template<typename T, std::size_t N>
constexpr inline std::size_t size(const T(&)[N]) noexcept
{ return N; }
int readline(std::istream &f, std::string &output)
{
while(f.good() && f.peek() == '\n')
@@ -148,7 +153,7 @@ bool load_ambdec_matrix(float (&gains)[MAX_AMBI_ORDER+1], al::vector<AmbDecConf:
buffer.c_str()+static_cast<std::size_t>(istr.tellg()));
return false;
}
if(curgain < countof(gains))
if(curgain < size(gains))
gains[curgain++] = value;
}
std::fill(std::begin(gains)+curgain, std::end(gains), 0.0f);
+9 -9
View File
@@ -4,7 +4,7 @@
#include <array>
#include <string>
#include "alMain.h"
#include "ambidefs.h"
#include "vector.h"
/* Helpers to read .ambdec configuration files. */
@@ -16,14 +16,14 @@ enum class AmbDecScale {
};
struct AmbDecConf {
std::string Description;
int Version; /* Must be 3 */
int Version{0}; /* Must be 3 */
unsigned int ChanMask;
unsigned int FreqBands; /* Must be 1 or 2 */
AmbDecScale CoeffScale;
unsigned int ChanMask{0u};
unsigned int FreqBands{0u}; /* Must be 1 or 2 */
AmbDecScale CoeffScale{};
float XOverFreq;
float XOverRatio;
float XOverFreq{0.0f};
float XOverRatio{0.0f};
struct SpeakerConf {
std::string Name;
@@ -36,10 +36,10 @@ struct AmbDecConf {
using CoeffArray = std::array<float,MAX_AMBI_COEFFS>;
/* Unused when FreqBands == 1 */
float LFOrderGain[MAX_AMBI_ORDER+1];
float LFOrderGain[MAX_AMBI_ORDER+1]{};
al::vector<CoeffArray> LFMatrix;
float HFOrderGain[MAX_AMBI_ORDER+1];
float HFOrderGain[MAX_AMBI_ORDER+1]{};
al::vector<CoeffArray> HFMatrix;
int load(const char *fname) noexcept;
+33
View File
@@ -0,0 +1,33 @@
#ifndef AMBIDEFS_H
#define AMBIDEFS_H
/* The maximum number of Ambisonics coefficients. For a given order (o), the
* size needed will be (o+1)**2, thus zero-order has 1, first-order has 4,
* second-order has 9, third-order has 16, and fourth-order has 25.
*/
#define MAX_AMBI_ORDER 3
#define MAX_AMBI_COEFFS ((MAX_AMBI_ORDER+1) * (MAX_AMBI_ORDER+1))
/* A bitmask of ambisonic channels for 0 to 4th order. This only specifies up
* to 4th order, which is the highest order a 32-bit mask value can specify (a
* 64-bit mask could handle up to 7th order).
*/
#define AMBI_0ORDER_MASK 0x00000001
#define AMBI_1ORDER_MASK 0x0000000f
#define AMBI_2ORDER_MASK 0x000001ff
#define AMBI_3ORDER_MASK 0x0000ffff
#define AMBI_4ORDER_MASK 0x01ffffff
/* A bitmask of ambisonic channels with height information. If none of these
* channels are used/needed, there's no height (e.g. with most surround sound
* speaker setups). This is ACN ordering, with bit 0 being ACN 0, etc.
*/
#define AMBI_PERIPHONIC_MASK (0xfe7ce4)
/* The maximum number of Ambisonic coefficients for 2D (non-periphonic)
* representation. This is 2 per each order above zero-order, plus 1 for zero-
* order. Or simply, o*2 + 1.
*/
#define MAX_AMBI2D_COEFFS (MAX_AMBI_ORDER*2 + 1)
#endif /* AMBIDEFS_H */
+8
View File
@@ -4,6 +4,14 @@
#include <stdio.h>
#if defined(_WIN64)
#define SZFMT "%I64u"
#elif defined(_WIN32)
#define SZFMT "%u"
#else
#define SZFMT "%zu"
#endif
#ifdef __GNUC__
#define DECL_FORMAT(x, y, z) __attribute__((format(x, (y), (z))))
#else
+1
View File
@@ -730,6 +730,7 @@ SET(ALC_OBJS
Alc/alconfig.cpp
Alc/alconfig.h
Alc/alcontext.h
Alc/ambidefs.h
Alc/bs2b.cpp
Alc/bs2b.h
Alc/converter.cpp
+1 -37
View File
@@ -33,6 +33,7 @@
#include "vector.h"
#include "almalloc.h"
#include "threads.h"
#include "ambidefs.h"
template<typename T, size_t N>
@@ -40,13 +41,6 @@ constexpr inline size_t countof(const T(&)[N]) noexcept
{ return N; }
#define COUNTOF countof
#if defined(_WIN64)
#define SZFMT "%I64u"
#elif defined(_WIN32)
#define SZFMT "%u"
#else
#define SZFMT "%zu"
#endif
#ifdef __has_builtin
#define HAS_BUILTIN __has_builtin
@@ -543,36 +537,6 @@ enum RenderMode {
};
/* The maximum number of Ambisonics coefficients. For a given order (o), the
* size needed will be (o+1)**2, thus zero-order has 1, first-order has 4,
* second-order has 9, third-order has 16, and fourth-order has 25.
*/
#define MAX_AMBI_ORDER 3
#define MAX_AMBI_COEFFS ((MAX_AMBI_ORDER+1) * (MAX_AMBI_ORDER+1))
/* A bitmask of ambisonic channels for 0 to 4th order. This only specifies up
* to 4th order, which is the highest order a 32-bit mask value can specify (a
* 64-bit mask could handle up to 7th order).
*/
#define AMBI_0ORDER_MASK 0x00000001
#define AMBI_1ORDER_MASK 0x0000000f
#define AMBI_2ORDER_MASK 0x000001ff
#define AMBI_3ORDER_MASK 0x0000ffff
#define AMBI_4ORDER_MASK 0x01ffffff
/* A bitmask of ambisonic channels with height information. If none of these
* channels are used/needed, there's no height (e.g. with most surround sound
* speaker setups). This is ACN ordering, with bit 0 being ACN 0, etc.
*/
#define AMBI_PERIPHONIC_MASK (0xfe7ce4)
/* The maximum number of Ambisonic coefficients for 2D (non-periphonic)
* representation. This is 2 per each order above zero-order, plus 1 for zero-
* order. Or simply, o*2 + 1.
*/
#define MAX_AMBI2D_COEFFS (MAX_AMBI_ORDER*2 + 1)
typedef ALfloat ChannelConfig[MAX_AMBI_COEFFS];
typedef struct BFChannelConfig {
ALfloat Scale;