Clean up some math stuff
This commit is contained in:
+33
-32
@@ -27,6 +27,7 @@
|
||||
#include <assert.h>
|
||||
|
||||
#include <cmath>
|
||||
#include <limits>
|
||||
#include <algorithm>
|
||||
|
||||
#include "alMain.h"
|
||||
@@ -437,37 +438,37 @@ bool CalcEffectSlotParams(ALeffectslot *slot, ALCcontext *context, bool force)
|
||||
constexpr struct ChanMap MonoMap[1]{
|
||||
{ FrontCenter, 0.0f, 0.0f }
|
||||
}, RearMap[2]{
|
||||
{ BackLeft, DEG2RAD(-150.0f), DEG2RAD(0.0f) },
|
||||
{ BackRight, DEG2RAD( 150.0f), DEG2RAD(0.0f) }
|
||||
{ BackLeft, Deg2Rad(-150.0f), Deg2Rad(0.0f) },
|
||||
{ BackRight, Deg2Rad( 150.0f), Deg2Rad(0.0f) }
|
||||
}, QuadMap[4]{
|
||||
{ FrontLeft, DEG2RAD( -45.0f), DEG2RAD(0.0f) },
|
||||
{ FrontRight, DEG2RAD( 45.0f), DEG2RAD(0.0f) },
|
||||
{ BackLeft, DEG2RAD(-135.0f), DEG2RAD(0.0f) },
|
||||
{ BackRight, DEG2RAD( 135.0f), DEG2RAD(0.0f) }
|
||||
{ FrontLeft, Deg2Rad( -45.0f), Deg2Rad(0.0f) },
|
||||
{ FrontRight, Deg2Rad( 45.0f), Deg2Rad(0.0f) },
|
||||
{ BackLeft, Deg2Rad(-135.0f), Deg2Rad(0.0f) },
|
||||
{ BackRight, Deg2Rad( 135.0f), Deg2Rad(0.0f) }
|
||||
}, X51Map[6]{
|
||||
{ FrontLeft, DEG2RAD( -30.0f), DEG2RAD(0.0f) },
|
||||
{ FrontRight, DEG2RAD( 30.0f), DEG2RAD(0.0f) },
|
||||
{ FrontCenter, DEG2RAD( 0.0f), DEG2RAD(0.0f) },
|
||||
{ FrontLeft, Deg2Rad( -30.0f), Deg2Rad(0.0f) },
|
||||
{ FrontRight, Deg2Rad( 30.0f), Deg2Rad(0.0f) },
|
||||
{ FrontCenter, Deg2Rad( 0.0f), Deg2Rad(0.0f) },
|
||||
{ LFE, 0.0f, 0.0f },
|
||||
{ SideLeft, DEG2RAD(-110.0f), DEG2RAD(0.0f) },
|
||||
{ SideRight, DEG2RAD( 110.0f), DEG2RAD(0.0f) }
|
||||
{ SideLeft, Deg2Rad(-110.0f), Deg2Rad(0.0f) },
|
||||
{ SideRight, Deg2Rad( 110.0f), Deg2Rad(0.0f) }
|
||||
}, X61Map[7]{
|
||||
{ FrontLeft, DEG2RAD(-30.0f), DEG2RAD(0.0f) },
|
||||
{ FrontRight, DEG2RAD( 30.0f), DEG2RAD(0.0f) },
|
||||
{ FrontCenter, DEG2RAD( 0.0f), DEG2RAD(0.0f) },
|
||||
{ FrontLeft, Deg2Rad(-30.0f), Deg2Rad(0.0f) },
|
||||
{ FrontRight, Deg2Rad( 30.0f), Deg2Rad(0.0f) },
|
||||
{ FrontCenter, Deg2Rad( 0.0f), Deg2Rad(0.0f) },
|
||||
{ LFE, 0.0f, 0.0f },
|
||||
{ BackCenter, DEG2RAD(180.0f), DEG2RAD(0.0f) },
|
||||
{ SideLeft, DEG2RAD(-90.0f), DEG2RAD(0.0f) },
|
||||
{ SideRight, DEG2RAD( 90.0f), DEG2RAD(0.0f) }
|
||||
{ BackCenter, Deg2Rad(180.0f), Deg2Rad(0.0f) },
|
||||
{ SideLeft, Deg2Rad(-90.0f), Deg2Rad(0.0f) },
|
||||
{ SideRight, Deg2Rad( 90.0f), Deg2Rad(0.0f) }
|
||||
}, X71Map[8]{
|
||||
{ FrontLeft, DEG2RAD( -30.0f), DEG2RAD(0.0f) },
|
||||
{ FrontRight, DEG2RAD( 30.0f), DEG2RAD(0.0f) },
|
||||
{ FrontCenter, DEG2RAD( 0.0f), DEG2RAD(0.0f) },
|
||||
{ FrontLeft, Deg2Rad( -30.0f), Deg2Rad(0.0f) },
|
||||
{ FrontRight, Deg2Rad( 30.0f), Deg2Rad(0.0f) },
|
||||
{ FrontCenter, Deg2Rad( 0.0f), Deg2Rad(0.0f) },
|
||||
{ LFE, 0.0f, 0.0f },
|
||||
{ BackLeft, DEG2RAD(-150.0f), DEG2RAD(0.0f) },
|
||||
{ BackRight, DEG2RAD( 150.0f), DEG2RAD(0.0f) },
|
||||
{ SideLeft, DEG2RAD( -90.0f), DEG2RAD(0.0f) },
|
||||
{ SideRight, DEG2RAD( 90.0f), DEG2RAD(0.0f) }
|
||||
{ BackLeft, Deg2Rad(-150.0f), Deg2Rad(0.0f) },
|
||||
{ BackRight, Deg2Rad( 150.0f), Deg2Rad(0.0f) },
|
||||
{ SideLeft, Deg2Rad( -90.0f), Deg2Rad(0.0f) },
|
||||
{ SideRight, Deg2Rad( 90.0f), Deg2Rad(0.0f) }
|
||||
};
|
||||
|
||||
void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev,
|
||||
@@ -480,8 +481,8 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev
|
||||
const ALCdevice *Device)
|
||||
{
|
||||
ChanMap StereoMap[2]{
|
||||
{ FrontLeft, DEG2RAD(-30.0f), DEG2RAD(0.0f) },
|
||||
{ FrontRight, DEG2RAD( 30.0f), DEG2RAD(0.0f) }
|
||||
{ FrontLeft, Deg2Rad(-30.0f), Deg2Rad(0.0f) },
|
||||
{ FrontRight, Deg2Rad( 30.0f), Deg2Rad(0.0f) }
|
||||
};
|
||||
|
||||
bool DirectChannels{props->DirectChannels != AL_FALSE};
|
||||
@@ -576,7 +577,7 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev
|
||||
{
|
||||
/* Special handling for B-Format sources. */
|
||||
|
||||
if(Distance > FLT_EPSILON)
|
||||
if(Distance > std::numeric_limits<float>::epsilon())
|
||||
{
|
||||
/* Panning a B-Format sound toward some direction is easy. Just pan
|
||||
* the first (W) channel as a normal mono sound and silence the
|
||||
@@ -733,7 +734,7 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev
|
||||
voice->Direct.Buffer = Device->RealOut.Buffer;
|
||||
voice->Direct.Channels = Device->RealOut.NumChannels;
|
||||
|
||||
if(Distance > FLT_EPSILON)
|
||||
if(Distance > std::numeric_limits<float>::epsilon())
|
||||
{
|
||||
/* Get the HRIR coefficients and delays just once, for the given
|
||||
* source direction.
|
||||
@@ -811,7 +812,7 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev
|
||||
{
|
||||
/* Non-HRTF rendering. Use normal panning to the output. */
|
||||
|
||||
if(Distance > FLT_EPSILON)
|
||||
if(Distance > std::numeric_limits<float>::epsilon())
|
||||
{
|
||||
/* Calculate NFC filter coefficient if needed. */
|
||||
if(Device->AvgSpeakerDist > 0.0f)
|
||||
@@ -1206,8 +1207,8 @@ void CalcAttnSourceParams(ALvoice *voice, const ALvoicePropsBase *props, const A
|
||||
/* Calculate directional soundcones */
|
||||
if(directional && props->InnerAngle < 360.0f)
|
||||
{
|
||||
ALfloat Angle{std::acos(aluDotproduct(Direction, SourceToListener))};
|
||||
Angle = RAD2DEG(Angle * ConeScale * 2.0f);
|
||||
const ALfloat Angle{Rad2Deg(std::acos(aluDotproduct(Direction, SourceToListener)) *
|
||||
ConeScale * 2.0f)};
|
||||
|
||||
ALfloat ConeVolume, ConeHF;
|
||||
if(!(Angle > props->InnerAngle))
|
||||
@@ -1322,7 +1323,7 @@ void CalcAttnSourceParams(ALvoice *voice, const ALvoicePropsBase *props, const A
|
||||
/* Source moving toward the listener at the speed of sound. Sound
|
||||
* waves bunch up to extreme frequencies.
|
||||
*/
|
||||
Pitch = HUGE_VALF;
|
||||
Pitch = std::numeric_limits<float>::infinity();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "splitter.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <limits>
|
||||
#include <algorithm>
|
||||
|
||||
#include "math_defs.h"
|
||||
@@ -13,7 +14,7 @@ void BandSplitter::init(float f0norm)
|
||||
{
|
||||
float w = f0norm * F_TAU;
|
||||
float cw = std::cos(w);
|
||||
if(cw > FLT_EPSILON)
|
||||
if(cw > std::numeric_limits<float>::epsilon())
|
||||
coeff = (std::sin(w) - 1.0f) / cw;
|
||||
else
|
||||
coeff = cw * -0.5f;
|
||||
@@ -63,7 +64,7 @@ void SplitterAllpass::init(float f0norm)
|
||||
{
|
||||
float w = f0norm * F_TAU;
|
||||
float cw = std::cos(w);
|
||||
if(cw > FLT_EPSILON)
|
||||
if(cw > std::numeric_limits<float>::epsilon())
|
||||
coeff = (std::sin(w) - 1.0f) / cw;
|
||||
else
|
||||
coeff = cw * -0.5f;
|
||||
|
||||
+2
-1
@@ -1,6 +1,7 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <limits>
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
|
||||
@@ -395,7 +396,7 @@ Compressor* CompressorInit(const ALsizei NumChans, const ALuint SampleRate,
|
||||
if(hold > 1)
|
||||
{
|
||||
Comp->Hold = new ((void*)(Comp + 1)) SlidingHold{};
|
||||
Comp->Hold->Values[0] = -HUGE_VALF;
|
||||
Comp->Hold->Values[0] = -std::numeric_limits<float>::infinity();
|
||||
Comp->Hold->Expiries[0] = hold;
|
||||
Comp->Hold->Length = hold;
|
||||
Comp->Delay = (ALfloat(*)[BUFFERSIZE])(Comp->Hold + 1);
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <limits>
|
||||
|
||||
#include "alMain.h"
|
||||
#include "alu.h"
|
||||
#include "alSource.h"
|
||||
@@ -137,7 +139,7 @@ void Mix_C(const ALfloat *data, ALsizei OutChans, ALfloat (*RESTRICT OutBuffer)[
|
||||
ALfloat gain = CurrentGains[c];
|
||||
const ALfloat diff = TargetGains[c] - gain;
|
||||
|
||||
if(fabsf(diff) > FLT_EPSILON)
|
||||
if(fabsf(diff) > std::numeric_limits<float>::epsilon())
|
||||
{
|
||||
ALsizei minsize = mini(BufferSize, Counter);
|
||||
const ALfloat step = diff * delta;
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include <arm_neon.h>
|
||||
|
||||
#include <limits>
|
||||
|
||||
#include "AL/al.h"
|
||||
#include "AL/alc.h"
|
||||
#include "alMain.h"
|
||||
@@ -182,7 +184,7 @@ void Mix_Neon(const ALfloat *data, ALsizei OutChans, ALfloat (*RESTRICT OutBuffe
|
||||
ALfloat gain = CurrentGains[c];
|
||||
const ALfloat diff = TargetGains[c] - gain;
|
||||
|
||||
if(fabsf(diff) > FLT_EPSILON)
|
||||
if(fabsf(diff) > std::numeric_limits<float>::epsilon())
|
||||
{
|
||||
ALsizei minsize = mini(BufferSize, Counter);
|
||||
const ALfloat step = diff * delta;
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include <xmmintrin.h>
|
||||
|
||||
#include <limits>
|
||||
|
||||
#include "AL/al.h"
|
||||
#include "AL/alc.h"
|
||||
#include "alMain.h"
|
||||
@@ -151,7 +153,7 @@ void Mix_SSE(const ALfloat *data, ALsizei OutChans, ALfloat (*RESTRICT OutBuffer
|
||||
ALfloat gain = CurrentGains[c];
|
||||
const ALfloat diff = TargetGains[c] - gain;
|
||||
|
||||
if(fabsf(diff) > FLT_EPSILON)
|
||||
if(fabsf(diff) > std::numeric_limits<float>::epsilon())
|
||||
{
|
||||
ALsizei minsize = mini(BufferSize, Counter);
|
||||
const ALfloat step = diff * delta;
|
||||
|
||||
+17
-18
@@ -10,6 +10,7 @@
|
||||
#include <ieeefp.h>
|
||||
#endif
|
||||
|
||||
#include <cmath>
|
||||
#include <array>
|
||||
|
||||
#include "alMain.h"
|
||||
@@ -106,15 +107,15 @@ enum {
|
||||
};
|
||||
|
||||
|
||||
typedef struct MixHrtfParams {
|
||||
struct MixHrtfParams {
|
||||
const ALfloat (*Coeffs)[2];
|
||||
ALsizei Delay[2];
|
||||
ALfloat Gain;
|
||||
ALfloat GainStep;
|
||||
} MixHrtfParams;
|
||||
};
|
||||
|
||||
|
||||
typedef struct DirectParams {
|
||||
struct DirectParams {
|
||||
BiquadFilter LowPass;
|
||||
BiquadFilter HighPass;
|
||||
|
||||
@@ -130,9 +131,9 @@ typedef struct DirectParams {
|
||||
ALfloat Current[MAX_OUTPUT_CHANNELS];
|
||||
ALfloat Target[MAX_OUTPUT_CHANNELS];
|
||||
} Gains;
|
||||
} DirectParams;
|
||||
};
|
||||
|
||||
typedef struct SendParams {
|
||||
struct SendParams {
|
||||
BiquadFilter LowPass;
|
||||
BiquadFilter HighPass;
|
||||
|
||||
@@ -140,7 +141,7 @@ typedef struct SendParams {
|
||||
ALfloat Current[MAX_OUTPUT_CHANNELS];
|
||||
ALfloat Target[MAX_OUTPUT_CHANNELS];
|
||||
} Gains;
|
||||
} SendParams;
|
||||
};
|
||||
|
||||
|
||||
struct ALvoicePropsBase {
|
||||
@@ -359,9 +360,7 @@ inline size_t clampz(size_t val, size_t min, size_t max) noexcept
|
||||
|
||||
|
||||
inline ALfloat lerp(ALfloat val1, ALfloat val2, ALfloat mu) noexcept
|
||||
{
|
||||
return val1 + (val2-val1)*mu;
|
||||
}
|
||||
{ return val1 + (val2-val1)*mu; }
|
||||
inline ALfloat cubic(ALfloat val1, ALfloat val2, ALfloat val3, ALfloat val4, ALfloat mu) noexcept
|
||||
{
|
||||
ALfloat mu2 = mu*mu, mu3 = mu2*mu;
|
||||
@@ -383,16 +382,16 @@ void aluInit(void);
|
||||
|
||||
void aluInitMixer(void);
|
||||
|
||||
ResamplerFunc SelectResampler(enum Resampler resampler);
|
||||
ResamplerFunc SelectResampler(Resampler resampler);
|
||||
|
||||
/* aluInitRenderer
|
||||
*
|
||||
* Set up the appropriate panning method and mixing method given the device
|
||||
* properties.
|
||||
*/
|
||||
void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf_appreq, enum HrtfRequestMode hrtf_userreq);
|
||||
void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appreq, HrtfRequestMode hrtf_userreq);
|
||||
|
||||
void aluInitEffectPanning(struct ALeffectslot *slot);
|
||||
void aluInitEffectPanning(ALeffectslot *slot);
|
||||
|
||||
void aluSelectPostProcess(ALCdevice *device);
|
||||
|
||||
@@ -435,9 +434,9 @@ inline void CalcDirectionCoeffs(const ALfloat dir[3], ALfloat spread, ALfloat (&
|
||||
*/
|
||||
inline void CalcAngleCoeffs(ALfloat azimuth, ALfloat elevation, ALfloat spread, ALfloat (&coeffs)[MAX_AMBI_COEFFS])
|
||||
{
|
||||
ALfloat x = -sinf(azimuth) * cosf(elevation);
|
||||
ALfloat y = sinf(elevation);
|
||||
ALfloat z = cosf(azimuth) * cosf(elevation);
|
||||
ALfloat x = -std::sin(azimuth) * std::cos(elevation);
|
||||
ALfloat y = std::sin(elevation);
|
||||
ALfloat z = std::cos(azimuth) * std::cos(elevation);
|
||||
|
||||
CalcAmbiCoeffs(x, y, z, spread, coeffs);
|
||||
}
|
||||
@@ -450,9 +449,9 @@ inline void CalcAngleCoeffs(ALfloat azimuth, ALfloat elevation, ALfloat spread,
|
||||
*/
|
||||
inline float ScaleAzimuthFront(float azimuth, float scale)
|
||||
{
|
||||
ALfloat sign = copysignf(1.0f, azimuth);
|
||||
if(!(fabsf(azimuth) > F_PI_2))
|
||||
return minf(fabsf(azimuth) * scale, F_PI_2) * sign;
|
||||
ALfloat sign = std::copysign(1.0f, azimuth);
|
||||
if(!(std::fabs(azimuth) > F_PI_2))
|
||||
return minf(std::fabs(azimuth) * scale, F_PI_2) * sign;
|
||||
return azimuth;
|
||||
}
|
||||
|
||||
|
||||
@@ -3335,8 +3335,8 @@ ALsource::ALsource(ALsizei num_sends)
|
||||
DirectChannels = AL_FALSE;
|
||||
Spatialize = SpatializeAuto;
|
||||
|
||||
StereoPan[0] = DEG2RAD( 30.0f);
|
||||
StereoPan[1] = DEG2RAD(-30.0f);
|
||||
StereoPan[0] = Deg2Rad( 30.0f);
|
||||
StereoPan[1] = Deg2Rad(-30.0f);
|
||||
|
||||
Radius = 0.0f;
|
||||
|
||||
|
||||
+2
-21
@@ -2,9 +2,6 @@
|
||||
#define AL_MATH_DEFS_H
|
||||
|
||||
#include <math.h>
|
||||
#ifdef HAVE_FLOAT_H
|
||||
#include <float.h>
|
||||
#endif
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI (3.14159265358979323846)
|
||||
@@ -14,25 +11,9 @@
|
||||
#define F_PI_2 (1.57079632679489661923f)
|
||||
#define F_TAU (6.28318530717958647692f)
|
||||
|
||||
#ifndef FLT_EPSILON
|
||||
#define FLT_EPSILON (1.19209290e-07f)
|
||||
#endif
|
||||
|
||||
#define SQRT_2 1.41421356237309504880
|
||||
#define SQRT_3 1.73205080756887719318
|
||||
|
||||
#define SQRTF_2 1.41421356237309504880f
|
||||
#define SQRTF_3 1.73205080756887719318f
|
||||
|
||||
#ifndef HUGE_VALF
|
||||
static const union msvc_inf_hack {
|
||||
unsigned char b[4];
|
||||
float f;
|
||||
} msvc_inf_union = {{ 0x00, 0x00, 0x80, 0x7F }};
|
||||
#define HUGE_VALF (msvc_inf_union.f)
|
||||
#endif
|
||||
|
||||
#define DEG2RAD(x) ((float)(x) * (float)(M_PI/180.0))
|
||||
#define RAD2DEG(x) ((float)(x) * (float)(180.0/M_PI))
|
||||
constexpr inline float Deg2Rad(float x) noexcept { return x * float{M_PI/180.0}; }
|
||||
constexpr inline float Rad2Deg(float x) noexcept { return x * float{180.0/M_PI}; }
|
||||
|
||||
#endif /* AL_MATH_DEFS_H */
|
||||
|
||||
+2
-1
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <cmath>
|
||||
#include <array>
|
||||
#include <limits>
|
||||
#include <algorithm>
|
||||
|
||||
#include "math_defs.h"
|
||||
@@ -41,7 +42,7 @@ public:
|
||||
float normalize()
|
||||
{
|
||||
const float length{std::sqrt(mVals[0]*mVals[0] + mVals[1]*mVals[1] + mVals[2]*mVals[2])};
|
||||
if(length > FLT_EPSILON)
|
||||
if(length > std::numeric_limits<float>::epsilon())
|
||||
{
|
||||
float inv_length = 1.0f/length;
|
||||
mVals[0] *= inv_length;
|
||||
|
||||
Reference in New Issue
Block a user