aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2017-05-30 05:13:54 -0700
committerChris Robinson <[email protected]>2017-05-30 05:13:54 -0700
commite893211b659a5dbaf75aa437ab594aac87984b85 (patch)
tree6589dd8c1be14ed11d2319e4ed027fc54fdef49b /Alc
parent6d4adc6ad6f387dcde4e01099e33672c4a19fda6 (diff)
Restrict ClampedDist to RefDistance for invalid distance attenuation
Diffstat (limited to 'Alc')
-rw-r--r--Alc/ALu.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index d7a8a89b..11b3fd26 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -1195,7 +1195,9 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
break;
/*fall-through*/
case InverseDistance:
- if(props->RefDistance > 0.0f)
+ if(!(props->RefDistance > 0.0f))
+ ClampedDist = props->RefDistance;
+ else
{
ALfloat dist = lerp(props->RefDistance, ClampedDist, props->RolloffFactor);
if(dist > 0.0f) DryGain *= props->RefDistance / dist;
@@ -1213,10 +1215,12 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
break;
/*fall-through*/
case LinearDistance:
- if(props->MaxDistance != props->RefDistance)
+ if(!(props->MaxDistance != props->RefDistance))
+ ClampedDist = props->RefDistance;
+ else
{
ALfloat attn = props->RolloffFactor * (ClampedDist-props->RefDistance) /
- (props->MaxDistance-props->RefDistance);
+ (props->MaxDistance-props->RefDistance);
DryGain *= maxf(1.0f - attn, 0.0f);
for(i = 0;i < NumSends;i++)
{
@@ -1233,7 +1237,9 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
break;
/*fall-through*/
case ExponentDistance:
- if(ClampedDist > 0.0f && props->RefDistance > 0.0f)
+ if(!(ClampedDist > 0.0f && props->RefDistance > 0.0f))
+ ClampedDist = props->RefDistance;
+ else
{
DryGain *= powf(ClampedDist/props->RefDistance, -props->RolloffFactor);
for(i = 0;i < NumSends;i++)