diff options
-rw-r--r-- | Alc/ALu.c | 35 | ||||
-rw-r--r-- | common/math_defs.h | 9 |
2 files changed, 31 insertions, 13 deletions
@@ -1336,20 +1336,33 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop if(DopplerFactor > 0.0f) { const aluVector *lvelocity = &Listener->Params.Velocity; - ALfloat SpeedOfSound = Listener->Params.SpeedOfSound; - ALfloat VSS, VLS; + const ALfloat SpeedOfSound = Listener->Params.SpeedOfSound; + ALfloat vss, vls; - if(SpeedOfSound < 1.0f) + vss = aluDotproduct(&Velocity, &SourceToListener) * DopplerFactor; + vls = aluDotproduct(lvelocity, &SourceToListener) * DopplerFactor; + + if(!(vls < SpeedOfSound)) { - DopplerFactor *= 1.0f/SpeedOfSound; - SpeedOfSound = 1.0f; + /* Listener moving away from the source at the speed of sound. + * Sound waves can't catch it. + */ + Pitch = 0.0f; + } + else if(!(vss < SpeedOfSound)) + { + /* Source moving toward the listener at the speed of sound. Sound + * waves bunch up to extreme frequencies. + */ + Pitch = HUGE_VALF; + } + else + { + /* Source and listener movement is nominal. Calculate the proper + * doppler shift. + */ + Pitch *= (SpeedOfSound-vls) / (SpeedOfSound-vss); } - - VSS = aluDotproduct(&Velocity, &SourceToListener) * DopplerFactor; - VLS = aluDotproduct(lvelocity, &SourceToListener) * DopplerFactor; - - Pitch *= clampf(SpeedOfSound-VLS, 1.0f, SpeedOfSound*2.0f - 1.0f) / - clampf(SpeedOfSound-VSS, 1.0f, SpeedOfSound*2.0f - 1.0f); } /* Adjust pitch based on the buffer and output frequencies, and calculate diff --git a/common/math_defs.h b/common/math_defs.h index 149cf80b..8756488c 100644 --- a/common/math_defs.h +++ b/common/math_defs.h @@ -1,6 +1,7 @@ #ifndef AL_MATH_DEFS_H #define AL_MATH_DEFS_H +#include <math.h> #ifdef HAVE_FLOAT_H #include <float.h> #endif @@ -13,7 +14,11 @@ #define FLT_EPSILON (1.19209290e-07f) #endif -#define DEG2RAD(x) ((ALfloat)(x) * (F_PI/180.0f)) -#define RAD2DEG(x) ((ALfloat)(x) * (180.0f/F_PI)) +#ifndef HUGE_VALF +#define HUGE_VALF (1.0f/0.0f) +#endif + +#define DEG2RAD(x) ((float)(x) * (F_PI/180.0f)) +#define RAD2DEG(x) ((float)(x) * (180.0f/F_PI)) #endif /* AL_MATH_DEFS_H */ |