diff options
author | Sven Gothel <[email protected]> | 2014-01-26 07:06:02 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2014-01-26 07:06:02 +0100 |
commit | e6f4251945c228a775649b5ccd7f11dd4519c28d (patch) | |
tree | 8454b34363358cf9bb502021a68c6985c97daac4 /Alc/panning.c | |
parent | 389ae1f767bfad6116e21306fc3cdf89a4cbcc0a (diff) | |
parent | 49baa9128dd98e986639def4f24c7522d9ec6b56 (diff) |
Merge branch 'UPSTREAM'
Diffstat (limited to 'Alc/panning.c')
-rw-r--r-- | Alc/panning.c | 108 |
1 files changed, 54 insertions, 54 deletions
diff --git a/Alc/panning.c b/Alc/panning.c index d8191d8d..30a1e571 100644 --- a/Alc/panning.c +++ b/Alc/panning.c @@ -31,6 +31,8 @@ #include "AL/alc.h" #include "alu.h" +extern inline void SetGains(const ALCdevice *device, ALfloat ingain, ALfloat gains[MaxChannels]); + static void SetSpeakerArrangement(const char *name, ALfloat SpeakerAngle[MaxChannels], enum Channel Speaker2Chan[MaxChannels], ALint chans) { @@ -102,7 +104,7 @@ static void SetSpeakerArrangement(const char *name, ALfloat SpeakerAngle[MaxChan { long angle = strtol(sep, NULL, 10); if(angle >= -180 && angle <= 180) - SpeakerAngle[i] = angle * F_PI/180.0f; + SpeakerAngle[i] = DEG2RAD(angle); else ERR("Invalid angle for speaker \"%s\": %ld\n", confkey, angle); break; @@ -140,13 +142,7 @@ static void SetSpeakerArrangement(const char *name, ALfloat SpeakerAngle[MaxChan } -/** - * ComputeAngleGains - * - * Sets channel gains based on a given source's angle and its half-width. The - * angle and hwidth parameters are in radians. - */ -ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, ALfloat ingain, ALfloat *gains) +void ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, ALfloat ingain, ALfloat gains[MaxChannels]) { ALfloat tmpgains[MaxChannels] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; enum Channel Speaker2Chan[MaxChannels]; @@ -161,9 +157,11 @@ ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, SpeakerAngle[i] = device->SpeakerAngle[i]; /* Some easy special-cases first... */ - if(device->NumChan == 1 || hwidth >= F_PI) + if(device->NumChan <= 1 || hwidth >= F_PI) { /* Full coverage for all speakers. */ + for(i = 0;i < MaxChannels;i++) + gains[i] = 0.0f; for(i = 0;i < device->NumChan;i++) { enum Channel chan = Speaker2Chan[i]; @@ -174,6 +172,8 @@ ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, if(hwidth <= 0.0f) { /* Infinitely small sound point. */ + for(i = 0;i < MaxChannels;i++) + gains[i] = 0.0f; for(i = 0;i < device->NumChan-1;i++) { if(angle >= SpeakerAngle[i] && angle < SpeakerAngle[i+1]) @@ -188,9 +188,9 @@ ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, } /* Sound is between last and first speakers */ if(angle < SpeakerAngle[0]) - angle += F_PI*2.0f; - a = (angle-SpeakerAngle[i]) / - (F_PI*2.0f + SpeakerAngle[0]-SpeakerAngle[i]); + angle += F_2PI; + a = (angle-SpeakerAngle[i]) / + (F_2PI + SpeakerAngle[0]-SpeakerAngle[i]); gains[Speaker2Chan[i]] = sqrtf(1.0f-a) * ingain; gains[Speaker2Chan[0]] = sqrtf( a) * ingain; return; @@ -203,7 +203,7 @@ ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, * within -pi...+pi. */ if(angle > 0.0f) { - ALuint done = 0; + ALuint done; ALuint i = 0; while(i < device->NumChan && device->SpeakerAngle[i]-angle < -F_PI) i++; @@ -215,7 +215,7 @@ ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, } for(i = 0;done < device->NumChan;i++) { - SpeakerAngle[done] = device->SpeakerAngle[i]-angle + F_PI*2.0f; + SpeakerAngle[done] = device->SpeakerAngle[i]-angle + F_2PI; Speaker2Chan[done] = device->Speaker2Chan[i]; done++; } @@ -226,7 +226,7 @@ ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, * we need to handle index 0. Because the iterators are unsigned, * they'll underflow and wrap to become 0xFFFFFFFF, which will * break as expected. */ - ALuint done = device->NumChan-1; + ALuint done; ALuint i = device->NumChan-1; while(i < device->NumChan && device->SpeakerAngle[i]-angle > F_PI) i--; @@ -238,7 +238,7 @@ ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, } for(i = device->NumChan-1;done < device->NumChan;i--) { - SpeakerAngle[done] = device->SpeakerAngle[i]-angle - F_PI*2.0f; + SpeakerAngle[done] = device->SpeakerAngle[i]-angle - F_2PI; Speaker2Chan[done] = device->Speaker2Chan[i]; done--; } @@ -268,14 +268,14 @@ ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, } if(SpeakerAngle[i] > rangle) { - a = (F_PI*2.0f + rangle-SpeakerAngle[last]) / - (F_PI*2.0f + SpeakerAngle[i]-SpeakerAngle[last]); + a = (F_2PI + rangle-SpeakerAngle[last]) / + (F_2PI + SpeakerAngle[i]-SpeakerAngle[last]); tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a); } else if(SpeakerAngle[last] < rangle) { - a = (rangle-SpeakerAngle[last]) / - (F_PI*2.0f + SpeakerAngle[i]-SpeakerAngle[last]); + a = (rangle-SpeakerAngle[last]) / + (F_2PI + SpeakerAngle[i]-SpeakerAngle[last]); tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a); } } while(0); @@ -320,14 +320,14 @@ ALvoid ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, } if(SpeakerAngle[i] < langle) { - a = (langle-SpeakerAngle[i]) / - (F_PI*2.0f + SpeakerAngle[0]-SpeakerAngle[i]); + a = (langle-SpeakerAngle[i]) / + (F_2PI + SpeakerAngle[0]-SpeakerAngle[i]); tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a); } else if(SpeakerAngle[0] > langle) { - a = (F_PI*2.0f + langle-SpeakerAngle[i]) / - (F_PI*2.0f + SpeakerAngle[0]-SpeakerAngle[i]); + a = (F_2PI + langle-SpeakerAngle[i]) / + (F_2PI + SpeakerAngle[0]-SpeakerAngle[i]); tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a); } } while(0); @@ -353,7 +353,7 @@ ALvoid aluInitPanning(ALCdevice *Device) case DevFmtMono: Device->NumChan = 1; Speaker2Chan[0] = FrontCenter; - SpeakerAngle[0] = F_PI/180.0f * 0.0f; + SpeakerAngle[0] = DEG2RAD(0.0f); layoutname = NULL; break; @@ -361,8 +361,8 @@ ALvoid aluInitPanning(ALCdevice *Device) Device->NumChan = 2; Speaker2Chan[0] = FrontLeft; Speaker2Chan[1] = FrontRight; - SpeakerAngle[0] = F_PI/180.0f * -90.0f; - SpeakerAngle[1] = F_PI/180.0f * 90.0f; + SpeakerAngle[0] = DEG2RAD(-90.0f); + SpeakerAngle[1] = DEG2RAD( 90.0f); layoutname = "layout_stereo"; break; @@ -372,10 +372,10 @@ ALvoid aluInitPanning(ALCdevice *Device) Speaker2Chan[1] = FrontLeft; Speaker2Chan[2] = FrontRight; Speaker2Chan[3] = BackRight; - SpeakerAngle[0] = F_PI/180.0f * -135.0f; - SpeakerAngle[1] = F_PI/180.0f * -45.0f; - SpeakerAngle[2] = F_PI/180.0f * 45.0f; - SpeakerAngle[3] = F_PI/180.0f * 135.0f; + SpeakerAngle[0] = DEG2RAD(-135.0f); + SpeakerAngle[1] = DEG2RAD( -45.0f); + SpeakerAngle[2] = DEG2RAD( 45.0f); + SpeakerAngle[3] = DEG2RAD( 135.0f); layoutname = "layout_quad"; break; @@ -386,11 +386,11 @@ ALvoid aluInitPanning(ALCdevice *Device) Speaker2Chan[2] = FrontCenter; Speaker2Chan[3] = FrontRight; Speaker2Chan[4] = BackRight; - SpeakerAngle[0] = F_PI/180.0f * -110.0f; - SpeakerAngle[1] = F_PI/180.0f * -30.0f; - SpeakerAngle[2] = F_PI/180.0f * 0.0f; - SpeakerAngle[3] = F_PI/180.0f * 30.0f; - SpeakerAngle[4] = F_PI/180.0f * 110.0f; + SpeakerAngle[0] = DEG2RAD(-110.0f); + SpeakerAngle[1] = DEG2RAD( -30.0f); + SpeakerAngle[2] = DEG2RAD( 0.0f); + SpeakerAngle[3] = DEG2RAD( 30.0f); + SpeakerAngle[4] = DEG2RAD( 110.0f); layoutname = "layout_surround51"; break; @@ -401,11 +401,11 @@ ALvoid aluInitPanning(ALCdevice *Device) Speaker2Chan[2] = FrontCenter; Speaker2Chan[3] = FrontRight; Speaker2Chan[4] = SideRight; - SpeakerAngle[0] = F_PI/180.0f * -90.0f; - SpeakerAngle[1] = F_PI/180.0f * -30.0f; - SpeakerAngle[2] = F_PI/180.0f * 0.0f; - SpeakerAngle[3] = F_PI/180.0f * 30.0f; - SpeakerAngle[4] = F_PI/180.0f * 90.0f; + SpeakerAngle[0] = DEG2RAD(-90.0f); + SpeakerAngle[1] = DEG2RAD(-30.0f); + SpeakerAngle[2] = DEG2RAD( 0.0f); + SpeakerAngle[3] = DEG2RAD( 30.0f); + SpeakerAngle[4] = DEG2RAD( 90.0f); layoutname = "layout_side51"; break; @@ -417,12 +417,12 @@ ALvoid aluInitPanning(ALCdevice *Device) Speaker2Chan[3] = FrontRight; Speaker2Chan[4] = SideRight; Speaker2Chan[5] = BackCenter; - SpeakerAngle[0] = F_PI/180.0f * -90.0f; - SpeakerAngle[1] = F_PI/180.0f * -30.0f; - SpeakerAngle[2] = F_PI/180.0f * 0.0f; - SpeakerAngle[3] = F_PI/180.0f * 30.0f; - SpeakerAngle[4] = F_PI/180.0f * 90.0f; - SpeakerAngle[5] = F_PI/180.0f * 180.0f; + SpeakerAngle[0] = DEG2RAD(-90.0f); + SpeakerAngle[1] = DEG2RAD(-30.0f); + SpeakerAngle[2] = DEG2RAD( 0.0f); + SpeakerAngle[3] = DEG2RAD( 30.0f); + SpeakerAngle[4] = DEG2RAD( 90.0f); + SpeakerAngle[5] = DEG2RAD(180.0f); layoutname = "layout_surround61"; break; @@ -435,13 +435,13 @@ ALvoid aluInitPanning(ALCdevice *Device) Speaker2Chan[4] = FrontRight; Speaker2Chan[5] = SideRight; Speaker2Chan[6] = BackRight; - SpeakerAngle[0] = F_PI/180.0f * -150.0f; - SpeakerAngle[1] = F_PI/180.0f * -90.0f; - SpeakerAngle[2] = F_PI/180.0f * -30.0f; - SpeakerAngle[3] = F_PI/180.0f * 0.0f; - SpeakerAngle[4] = F_PI/180.0f * 30.0f; - SpeakerAngle[5] = F_PI/180.0f * 90.0f; - SpeakerAngle[6] = F_PI/180.0f * 150.0f; + SpeakerAngle[0] = DEG2RAD(-150.0f); + SpeakerAngle[1] = DEG2RAD( -90.0f); + SpeakerAngle[2] = DEG2RAD( -30.0f); + SpeakerAngle[3] = DEG2RAD( 0.0f); + SpeakerAngle[4] = DEG2RAD( 30.0f); + SpeakerAngle[5] = DEG2RAD( 90.0f); + SpeakerAngle[6] = DEG2RAD( 150.0f); layoutname = "layout_surround71"; break; } |