aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/ALc.c1
-rw-r--r--Alc/ALu.c3
-rw-r--r--OpenAL32/Include/alMain.h1
-rw-r--r--OpenAL32/alSource.c11
-rw-r--r--OpenAL32/alState.c54
-rw-r--r--include/AL/alext.h5
6 files changed, 63 insertions, 12 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index c25fa5af..9225f330 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -561,6 +561,7 @@ static ALvoid InitContext(ALCcontext *pContext)
//Set globals
pContext->DistanceModel = AL_INVERSE_DISTANCE_CLAMPED;
+ pContext->SourceDistanceModel = AL_FALSE;
pContext->DopplerFactor = 1.0f;
pContext->DopplerVelocity = 1.0f;
pContext->flSpeedOfSound = SPEEDOFSOUNDMETRESPERSEC;
diff --git a/Alc/ALu.c b/Alc/ALu.c
index fa2c92ea..54369c4b 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -589,7 +589,8 @@ static ALvoid CalcSourceParams(const ALCcontext *ALContext, ALsource *ALSource,
RoomRolloff[i] += ALSource->Send[i].Slot->effect.Reverb.RoomRolloffFactor;
}
- switch(ALSource->DistanceModel)
+ switch(ALContext->SourceDistanceModel ? ALSource->DistanceModel :
+ ALContext->DistanceModel)
{
case AL_INVERSE_DISTANCE_CLAMPED:
Distance=__max(Distance,MinDist);
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index 2bcecf05..e235794a 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -310,6 +310,7 @@ struct ALCcontext_struct
ALboolean InUse;
ALenum DistanceModel;
+ ALboolean SourceDistanceModel;
ALfloat DopplerFactor;
ALfloat DopplerVelocity;
diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c
index fb0ac514..06f3be70 100644
--- a/OpenAL32/alSource.c
+++ b/OpenAL32/alSource.c
@@ -32,7 +32,7 @@
#include "alThunk.h"
#include "alAuxEffectSlot.h"
-static ALvoid InitSourceParams(ALCcontext *Context, ALsource *pSource);
+static ALvoid InitSourceParams(ALsource *pSource);
static ALboolean GetSourceOffset(ALsource *pSource, ALenum eName, ALfloat *pflOffset, ALuint updateSize);
static ALvoid ApplyOffset(ALsource *pSource, ALboolean bUpdateContext);
static ALint GetByteOffset(ALsource *pSource);
@@ -74,7 +74,7 @@ ALAPI ALvoid ALAPIENTRY alGenSources(ALsizei n,ALuint *sources)
sources[i] = (ALuint)ALTHUNK_ADDENTRY(*list);
(*list)->source = sources[i];
- InitSourceParams(Context, *list);
+ InitSourceParams(*list);
Context->SourceCount++;
i++;
@@ -697,7 +697,8 @@ ALAPI ALvoid ALAPIENTRY alSourcei(ALuint source,ALenum eParam,ALint lValue)
lValue == AL_EXPONENT_DISTANCE_CLAMPED)
{
pSource->DistanceModel = lValue;
- pSource->NeedsUpdate = AL_TRUE;
+ if(pContext->SourceDistanceModel)
+ pSource->NeedsUpdate = AL_TRUE;
}
else
alSetError(AL_INVALID_VALUE);
@@ -1781,7 +1782,7 @@ ALAPI ALvoid ALAPIENTRY alSourceUnqueueBuffers( ALuint source, ALsizei n, ALuint
}
-static ALvoid InitSourceParams(ALCcontext *Context, ALsource *pSource)
+static ALvoid InitSourceParams(ALsource *pSource)
{
pSource->flInnerAngle = 360.0f;
pSource->flOuterAngle = 360.0f;
@@ -1812,7 +1813,7 @@ static ALvoid InitSourceParams(ALCcontext *Context, ALsource *pSource)
pSource->RoomRolloffFactor = 0.0f;
pSource->DopplerFactor = 1.0f;
- pSource->DistanceModel = Context->DistanceModel;
+ pSource->DistanceModel = AL_INVERSE_DISTANCE_CLAMPED;
pSource->state = AL_INITIAL;
pSource->lSourceType = AL_UNDETERMINED;
diff --git a/OpenAL32/alState.c b/OpenAL32/alState.c
index 1516bb31..9b17045e 100644
--- a/OpenAL32/alState.c
+++ b/OpenAL32/alState.c
@@ -44,34 +44,66 @@ static const ALchar alErrOutOfMemory[] = "Out of Memory";
ALAPI ALvoid ALAPIENTRY alEnable(ALenum capability)
{
ALCcontext *Context;
+ ALboolean updateSources = AL_FALSE;
Context = GetContextSuspended();
if(!Context) return;
switch(capability)
{
+ case AL_SOURCE_DISTANCE_MODEL:
+ Context->SourceDistanceModel = AL_TRUE;
+ updateSources = AL_TRUE;
+ break;
+
default:
alSetError(AL_INVALID_ENUM);
break;
}
+ if(updateSources)
+ {
+ ALsource *source = Context->Source;
+ while(source)
+ {
+ source->NeedsUpdate = AL_TRUE;
+ source = source->next;
+ }
+ }
+
ProcessContext(Context);
}
ALAPI ALvoid ALAPIENTRY alDisable(ALenum capability)
{
ALCcontext *Context;
+ ALboolean updateSources = AL_FALSE;
Context = GetContextSuspended();
if(!Context) return;
switch(capability)
{
+ case AL_SOURCE_DISTANCE_MODEL:
+ Context->SourceDistanceModel = AL_FALSE;
+ updateSources = AL_TRUE;
+ break;
+
default:
alSetError(AL_INVALID_ENUM);
break;
}
+ if(updateSources)
+ {
+ ALsource *source = Context->Source;
+ while(source)
+ {
+ source->NeedsUpdate = AL_TRUE;
+ source = source->next;
+ }
+ }
+
ProcessContext(Context);
}
@@ -85,6 +117,10 @@ ALAPI ALboolean ALAPIENTRY alIsEnabled(ALenum capability)
switch(capability)
{
+ case AL_SOURCE_DISTANCE_MODEL:
+ value = Context->SourceDistanceModel;
+ break;
+
default:
alSetError(AL_INVALID_ENUM);
break;
@@ -588,7 +624,7 @@ ALAPI ALvoid ALAPIENTRY alSpeedOfSound(ALfloat flSpeedOfSound)
ALAPI ALvoid ALAPIENTRY alDistanceModel(ALenum value)
{
ALCcontext *Context;
- ALsource *Source;
+ ALboolean updateSources = AL_FALSE;
Context = GetContextSuspended();
if(!Context) return;
@@ -603,11 +639,7 @@ ALAPI ALvoid ALAPIENTRY alDistanceModel(ALenum value)
case AL_EXPONENT_DISTANCE:
case AL_EXPONENT_DISTANCE_CLAMPED:
Context->DistanceModel = value;
- for(Source = Context->Source;Source != NULL;Source = Source->next)
- {
- Source->DistanceModel = value;
- Source->NeedsUpdate = AL_TRUE;
- }
+ updateSources = !Context->SourceDistanceModel;
break;
default:
@@ -615,5 +647,15 @@ ALAPI ALvoid ALAPIENTRY alDistanceModel(ALenum value)
break;
}
+ if(updateSources)
+ {
+ ALsource *source = Context->Source;
+ while(source)
+ {
+ source->NeedsUpdate = AL_TRUE;
+ source = source->next;
+ }
+ }
+
ProcessContext(Context);
}
diff --git a/include/AL/alext.h b/include/AL/alext.h
index 610f2839..ea3c207e 100644
--- a/include/AL/alext.h
+++ b/include/AL/alext.h
@@ -150,6 +150,11 @@ typedef ALCboolean (ALC_APIENTRY*PFNALCMAKECURRENTPROC)(ALCcontext *context);
typedef ALCcontext* (ALC_APIENTRY*PFNALCGETTHREADCONTEXTPROC)(void);
#endif
+#ifndef AL_EXT_source_distance_model
+#define AL_EXT_source_distance_model 1
+#define AL_SOURCE_DISTANCE_MODEL 0x200
+#endif
+
#ifdef __cplusplus
}
#endif