aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32/alSource.c
diff options
context:
space:
mode:
Diffstat (limited to 'OpenAL32/alSource.c')
-rw-r--r--OpenAL32/alSource.c162
1 files changed, 88 insertions, 74 deletions
diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c
index 5350ca75..9f5bd8bc 100644
--- a/OpenAL32/alSource.c
+++ b/OpenAL32/alSource.c
@@ -55,6 +55,7 @@ static ALint GetSampleOffset(ALsource *Source);
static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, ALenum name, const ALfloat *values);
static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, const ALint *values);
+static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name, const ALint64SOFT *values);
static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, ALenum name, ALdouble *values);
static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, ALenum name, ALint *values);
@@ -459,7 +460,86 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
break;
default:
- return AL_INVALID_ENUM;
+ RETERR(AL_INVALID_ENUM);
+ }
+
+ return AL_NO_ERROR;
+}
+
+static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name, const ALint64SOFT *values)
+{
+ ALfloat fvals[3];
+ ALint ivals[3];
+ ALenum err;
+
+ switch(name)
+ {
+ /* 1x int */
+ case AL_SOURCE_RELATIVE:
+ case AL_LOOPING:
+ case AL_SOURCE_STATE:
+ case AL_BYTE_OFFSET:
+ case AL_SAMPLE_OFFSET:
+ case AL_DIRECT_FILTER_GAINHF_AUTO:
+ case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO:
+ case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO:
+ case AL_DIRECT_CHANNELS_SOFT:
+ case AL_DISTANCE_MODEL:
+ CHECKVAL(*values <= INT_MAX && *values >= INT_MIN);
+
+ ivals[0] = *values;
+ if((err=SetSourceiv(Source, Context, name, ivals)))
+ return err;
+ break;
+
+ /* 1x uint */
+ case AL_BUFFER:
+ case AL_DIRECT_FILTER:
+ CHECKVAL(*values <= UINT_MAX && *values >= 0);
+
+ ivals[0] = (ALuint)*values;
+ if((err=SetSourceiv(Source, Context, name, ivals)))
+ return err;
+ break;
+
+ /* 3x uint */
+ case AL_AUXILIARY_SEND_FILTER:
+ CHECKVAL(values[0] <= UINT_MAX && values[0] >= 0 &&
+ values[1] <= UINT_MAX && values[1] >= 0 &&
+ values[2] <= UINT_MAX && values[2] >= 0);
+
+ ivals[0] = (ALuint)values[0];
+ ivals[1] = (ALuint)values[1];
+ ivals[2] = (ALuint)values[2];
+ if((err=SetSourceiv(Source, Context, name, ivals)))
+ return err;
+ break;
+
+ /* 1x float */
+ case AL_MAX_DISTANCE:
+ case AL_ROLLOFF_FACTOR:
+ case AL_CONE_INNER_ANGLE:
+ case AL_CONE_OUTER_ANGLE:
+ case AL_REFERENCE_DISTANCE:
+ case AL_SEC_OFFSET:
+ fvals[0] = (ALfloat)*values;
+ if((err=SetSourcefv(Source, Context, name, fvals)) != AL_NO_ERROR)
+ return err;
+ break;
+
+ /* 3x float */
+ case AL_POSITION:
+ case AL_VELOCITY:
+ case AL_DIRECTION:
+ fvals[0] = (ALfloat)values[0];
+ fvals[1] = (ALfloat)values[1];
+ fvals[2] = (ALfloat)values[2];
+ if((err=SetSourcefv(Source, Context, name, fvals)) != AL_NO_ERROR)
+ return err;
+ break;
+
+ default:
+ RETERR(AL_INVALID_ENUM);
}
return AL_NO_ERROR;
@@ -1295,24 +1375,9 @@ AL_API ALvoid AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SO
case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO:
case AL_DIRECT_CHANNELS_SOFT:
case AL_DISTANCE_MODEL:
- if(!(value <= INT_MAX && value >= INT_MIN))
- alSetError(Context, AL_INVALID_VALUE);
- else
- {
- ALint ival = value;
- SetSourceiv(Source, Context, param, &ival);
- }
- break;
-
case AL_BUFFER:
case AL_DIRECT_FILTER:
- if(!(value <= UINT_MAX && value >= 0))
- alSetError(Context, AL_INVALID_VALUE);
- else
- {
- ALint ival = value;
- SetSourceiv(Source, Context, param, &ival);
- }
+ SetSourcei64v(Source, Context, param, &value);
break;
default:
@@ -1326,6 +1391,7 @@ AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOF
{
ALCcontext *Context;
ALsource *Source;
+ ALint64SOFT i64vals[3];
Context = GetContextRef();
if(!Context) return;
@@ -1337,27 +1403,11 @@ AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOF
case AL_POSITION:
case AL_VELOCITY:
case AL_DIRECTION:
- if(!(value1 <= INT_MAX && value1 >= INT_MIN &&
- value2 <= INT_MAX && value2 >= INT_MIN &&
- value3 <= INT_MAX && value3 >= INT_MIN))
- alSetError(Context, AL_INVALID_VALUE);
- else
- {
- ALint ivals[3] = { value1, value2, value3 };
- SetSourceiv(Source, Context, param, ivals);
- }
- break;
-
case AL_AUXILIARY_SEND_FILTER:
- if(!(value1 <= UINT_MAX && value1 >= 0 &&
- value2 <= UINT_MAX && value2 >= 0 &&
- value3 <= UINT_MAX && value3 >= 0))
- alSetError(Context, AL_INVALID_VALUE);
- else
- {
- ALint ivals[3] = { value1, value2, value3 };
- SetSourceiv(Source, Context, param, ivals);
- }
+ i64vals[0] = value1;
+ i64vals[1] = value2;
+ i64vals[2] = value3;
+ SetSourcei64v(Source, Context, param, i64vals);
break;
default:
@@ -1397,50 +1447,14 @@ AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALin
case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO:
case AL_DISTANCE_MODEL:
case AL_DIRECT_CHANNELS_SOFT:
- if(!(values[0] <= INT_MAX && values[0] >= INT_MIN))
- alSetError(Context, AL_INVALID_VALUE);
- else
- {
- ALint ival = values[0];
- SetSourceiv(Source, Context, param, &ival);
- }
- break;
-
case AL_BUFFER:
case AL_DIRECT_FILTER:
- if(!(values[0] <= UINT_MAX && values[0] >= 0))
- alSetError(Context, AL_INVALID_VALUE);
- else
- {
- ALint ival = values[0];
- SetSourceiv(Source, Context, param, &ival);
- }
- break;
case AL_POSITION:
case AL_VELOCITY:
case AL_DIRECTION:
- if(!(values[0] <= INT_MAX && values[0] >= INT_MIN &&
- values[1] <= INT_MAX && values[1] >= INT_MIN &&
- values[2] <= INT_MAX && values[2] >= INT_MIN))
- alSetError(Context, AL_INVALID_VALUE);
- else
- {
- ALint ivals[3] = { values[0], values[1], values[2] };
- SetSourceiv(Source, Context, param, ivals);
- }
- break;
-
case AL_AUXILIARY_SEND_FILTER:
- if(!(values[0] <= UINT_MAX && values[0] >= 0 &&
- values[1] <= UINT_MAX && values[1] >= 0 &&
- values[2] <= UINT_MAX && values[2] >= 0))
- alSetError(Context, AL_INVALID_VALUE);
- else
- {
- ALint ivals[3] = { values[0], values[1], values[2] };
- SetSourceiv(Source, Context, param, ivals);
- }
+ SetSourcei64v(Source, Context, param, values);
break;
default: