Use a helper to count the number of float/double values for a property
authorChris Robinson <chris.kcat@gmail.com>
Thu, 6 Dec 2012 04:51:25 +0000 (5 20:51 -0800)
committerChris Robinson <chris.kcat@gmail.com>
Thu, 6 Dec 2012 04:51:25 +0000 (5 20:51 -0800)
OpenAL32/alSource.c

index 2079f19..bd2e6f6 100644 (file)
@@ -153,6 +153,106 @@ static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, SrcFloatP
 static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, SrcIntProp prop, ALint *values);
 static ALenum GetSourcei64v(const ALsource *Source, ALCcontext *Context, SrcIntProp prop, ALint64 *values);
 
+static ALint FloatValsByProp(ALenum prop)
+{
+    if(prop != (ALenum)((SrcFloatProp)prop))
+        return 0;
+    switch((SrcFloatProp)prop)
+    {
+        case sfPitch:
+        case sfGain:
+        case sfMinGain:
+        case sfMaxGain:
+        case sfMaxDistance:
+        case sfRolloffFactor:
+        case sfDopplerFactor:
+        case sfConeOuterGain:
+        case sfSecOffset:
+        case sfSampleOffset:
+        case sfByteOffset:
+        case sfConeInnerAngle:
+        case sfConeOuterAngle:
+        case sfRefDistance:
+        case sfConeOuterGainHF:
+        case sfAirAbsorptionFactor:
+        case sfRoomRolloffFactor:
+        case sfDirectFilterGainHFAuto:
+        case sfAuxSendFilterGainAuto:
+        case sfAuxSendFilterGainHFAuto:
+        case sfDirectChannelsSOFT:
+        case sfDistanceModel:
+        case sfSourceRelative:
+        case sfLooping:
+        case sfBuffer:
+        case sfSourceState:
+        case sfBuffersQueued:
+        case sfBuffersProcessed:
+        case sfSourceType:
+            return 1;
+
+        case sfSampleRWOffsetsSOFT:
+        case sfByteRWOffsetsSOFT:
+            return 2;
+
+        case sfPosition:
+        case sfVelocity:
+        case sfDirection:
+            return 3;
+
+        case sfSecOffsetLatencySOFT:
+            break; /* Double only */
+    }
+    return 0;
+}
+static ALint DoubleValsByProp(ALenum prop)
+{
+    if(prop != (ALenum)((SrcFloatProp)prop))
+        return 0;
+    switch((SrcFloatProp)prop)
+    {
+        case sfPitch:
+        case sfGain:
+        case sfMinGain:
+        case sfMaxGain:
+        case sfMaxDistance:
+        case sfRolloffFactor:
+        case sfDopplerFactor:
+        case sfConeOuterGain:
+        case sfSecOffset:
+        case sfSampleOffset:
+        case sfByteOffset:
+        case sfConeInnerAngle:
+        case sfConeOuterAngle:
+        case sfRefDistance:
+        case sfConeOuterGainHF:
+        case sfAirAbsorptionFactor:
+        case sfRoomRolloffFactor:
+        case sfDirectFilterGainHFAuto:
+        case sfAuxSendFilterGainAuto:
+        case sfAuxSendFilterGainHFAuto:
+        case sfDirectChannelsSOFT:
+        case sfDistanceModel:
+        case sfSourceRelative:
+        case sfLooping:
+        case sfBuffer:
+        case sfSourceState:
+        case sfBuffersQueued:
+        case sfBuffersProcessed:
+        case sfSourceType:
+            return 1;
+
+        case sfSampleRWOffsetsSOFT:
+        case sfByteRWOffsetsSOFT:
+        case sfSecOffsetLatencySOFT:
+            return 2;
+
+        case sfPosition:
+        case sfVelocity:
+        case sfDirection:
+            return 3;
+    }
+    return 0;
+}
 
 static ALint IntValsByProp(ALenum prop)
 {
@@ -1242,31 +1342,10 @@ AL_API ALvoid AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value)
 
     if((Source=LookupSource(Context, source)) == NULL)
         alSetError(Context, AL_INVALID_NAME);
-    else switch(param)
-    {
-        case AL_PITCH:
-        case AL_CONE_INNER_ANGLE:
-        case AL_CONE_OUTER_ANGLE:
-        case AL_GAIN:
-        case AL_MAX_DISTANCE:
-        case AL_ROLLOFF_FACTOR:
-        case AL_REFERENCE_DISTANCE:
-        case AL_MIN_GAIN:
-        case AL_MAX_GAIN:
-        case AL_CONE_OUTER_GAIN:
-        case AL_CONE_OUTER_GAINHF:
-        case AL_AIR_ABSORPTION_FACTOR:
-        case AL_ROOM_ROLLOFF_FACTOR:
-        case AL_DOPPLER_FACTOR:
-        case AL_SEC_OFFSET:
-        case AL_SAMPLE_OFFSET:
-        case AL_BYTE_OFFSET:
-            SetSourcefv(Source, Context, param, &value);
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
-    }
+    else if(!(FloatValsByProp(param) == 1))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
+        SetSourcefv(Source, Context, param, &value);
 
     ALCcontext_DecRef(Context);
 }
@@ -1275,26 +1354,18 @@ AL_API ALvoid AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1
 {
     ALCcontext *Context;
     ALsource   *Source;
-    ALfloat    fvals[3];
 
     Context = GetContextRef();
     if(!Context) return;
 
     if((Source=LookupSource(Context, source)) == NULL)
         alSetError(Context, AL_INVALID_NAME);
-    else switch(param)
+    else if(!(FloatValsByProp(param) == 3))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
     {
-        case AL_POSITION:
-        case AL_VELOCITY:
-        case AL_DIRECTION:
-            fvals[0] = value1;
-            fvals[1] = value2;
-            fvals[2] = value3;
-            SetSourcefv(Source, Context, param, fvals);
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
+        ALfloat fvals[3] = { value1, value2, value3 };
+        SetSourcefv(Source, Context, param, fvals);
     }
 
     ALCcontext_DecRef(Context);
@@ -1312,34 +1383,10 @@ AL_API ALvoid AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat
         alSetError(Context, AL_INVALID_NAME);
     else if(!values)
         alSetError(Context, AL_INVALID_VALUE);
-    else switch(param)
-    {
-        case AL_PITCH:
-        case AL_CONE_INNER_ANGLE:
-        case AL_CONE_OUTER_ANGLE:
-        case AL_GAIN:
-        case AL_MAX_DISTANCE:
-        case AL_ROLLOFF_FACTOR:
-        case AL_REFERENCE_DISTANCE:
-        case AL_MIN_GAIN:
-        case AL_MAX_GAIN:
-        case AL_CONE_OUTER_GAIN:
-        case AL_CONE_OUTER_GAINHF:
-        case AL_SEC_OFFSET:
-        case AL_SAMPLE_OFFSET:
-        case AL_BYTE_OFFSET:
-        case AL_AIR_ABSORPTION_FACTOR:
-        case AL_ROOM_ROLLOFF_FACTOR:
-
-        case AL_POSITION:
-        case AL_VELOCITY:
-        case AL_DIRECTION:
-            SetSourcefv(Source, Context, param, values);
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
-    }
+    else if(!(FloatValsByProp(param) > 0))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
+        SetSourcefv(Source, Context, param, values);
 
     ALCcontext_DecRef(Context);
 }
@@ -1349,38 +1396,18 @@ AL_API ALvoid AL_APIENTRY alSourcedSOFT(ALuint source, ALenum param, ALdouble va
 {
     ALCcontext *Context;
     ALsource   *Source;
-    ALfloat    fval;
 
     Context = GetContextRef();
     if(!Context) return;
 
     if((Source=LookupSource(Context, source)) == NULL)
         alSetError(Context, AL_INVALID_NAME);
-    else switch(param)
+    else if(!(DoubleValsByProp(param) == 1))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
     {
-        case AL_PITCH:
-        case AL_CONE_INNER_ANGLE:
-        case AL_CONE_OUTER_ANGLE:
-        case AL_GAIN:
-        case AL_MAX_DISTANCE:
-        case AL_ROLLOFF_FACTOR:
-        case AL_REFERENCE_DISTANCE:
-        case AL_MIN_GAIN:
-        case AL_MAX_GAIN:
-        case AL_CONE_OUTER_GAIN:
-        case AL_CONE_OUTER_GAINHF:
-        case AL_AIR_ABSORPTION_FACTOR:
-        case AL_ROOM_ROLLOFF_FACTOR:
-        case AL_DOPPLER_FACTOR:
-        case AL_SEC_OFFSET:
-        case AL_SAMPLE_OFFSET:
-        case AL_BYTE_OFFSET:
-            fval = (ALfloat)value;
-            SetSourcefv(Source, Context, param, &fval);
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
+        ALfloat fval = (ALfloat)value;
+        SetSourcefv(Source, Context, param, &fval);
     }
 
     ALCcontext_DecRef(Context);
@@ -1390,26 +1417,18 @@ AL_API ALvoid AL_APIENTRY alSource3dSOFT(ALuint source, ALenum param, ALdouble v
 {
     ALCcontext *Context;
     ALsource   *Source;
-    ALfloat    fvals[3];
 
     Context = GetContextRef();
     if(!Context) return;
 
     if((Source=LookupSource(Context, source)) == NULL)
         alSetError(Context, AL_INVALID_NAME);
-    else switch(param)
+    else if(!(DoubleValsByProp(param) == 3))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
     {
-        case AL_POSITION:
-        case AL_VELOCITY:
-        case AL_DIRECTION:
-            fvals[0] = (ALfloat)value1;
-            fvals[1] = (ALfloat)value2;
-            fvals[2] = (ALfloat)value3;
-            SetSourcefv(Source, Context, param, fvals);
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
+        ALfloat fvals[3] = { (ALfloat)value1, (ALfloat)value2, (ALfloat)value3 };
+        SetSourcefv(Source, Context, param, fvals);
     }
 
     ALCcontext_DecRef(Context);
@@ -1419,7 +1438,7 @@ AL_API ALvoid AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdo
 {
     ALCcontext *Context;
     ALsource   *Source;
-    ALfloat    fvals[3];
+    ALint      count;
 
     Context = GetContextRef();
     if(!Context) return;
@@ -1428,45 +1447,16 @@ AL_API ALvoid AL_APIENTRY alSourcedvSOFT(ALuint source, ALenum param, const ALdo
         alSetError(Context, AL_INVALID_NAME);
     else if(!values)
         alSetError(Context, AL_INVALID_VALUE);
-    else switch(param)
+    else if(!((count=DoubleValsByProp(param)) > 0 && count <= 3))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
     {
-        case AL_PITCH:
-        case AL_CONE_INNER_ANGLE:
-        case AL_CONE_OUTER_ANGLE:
-        case AL_GAIN:
-        case AL_MAX_DISTANCE:
-        case AL_ROLLOFF_FACTOR:
-        case AL_REFERENCE_DISTANCE:
-        case AL_MIN_GAIN:
-        case AL_MAX_GAIN:
-        case AL_CONE_OUTER_GAIN:
-        case AL_CONE_OUTER_GAINHF:
-        case AL_SEC_OFFSET:
-        case AL_SAMPLE_OFFSET:
-        case AL_BYTE_OFFSET:
-        case AL_AIR_ABSORPTION_FACTOR:
-        case AL_ROOM_ROLLOFF_FACTOR:
-            fvals[0] = (ALfloat)values[0];
-            SetSourcefv(Source, Context, param, fvals);
-            break;
-
-        case AL_SEC_OFFSET_LATENCY_SOFT:
-            fvals[0] = (ALfloat)values[0];
-            fvals[1] = (ALfloat)values[1];
-            SetSourcefv(Source, Context, param, fvals);
-            break;
+        ALfloat fvals[3];
+        ALint i;
 
-        case AL_POSITION:
-        case AL_VELOCITY:
-        case AL_DIRECTION:
-            fvals[0] = (ALfloat)values[0];
-            fvals[1] = (ALfloat)values[1];
-            fvals[2] = (ALfloat)values[2];
-            SetSourcefv(Source, Context, param, fvals);
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
+        for(i = 0;i < count;i++)
+            fvals[i] = (ALfloat)values[i];
+        SetSourcefv(Source, Context, param, fvals);
     }
 
     ALCcontext_DecRef(Context);
@@ -1597,7 +1587,6 @@ AL_API ALvoid AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *val
 {
     ALCcontext *Context;
     ALsource   *Source;
-    ALdouble   dval;
 
     Context = GetContextRef();
     if(!Context) return;
@@ -1606,31 +1595,13 @@ AL_API ALvoid AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *val
         alSetError(Context, AL_INVALID_NAME);
     else if(!value)
         alSetError(Context, AL_INVALID_VALUE);
-    else switch(param)
+    else if(!(FloatValsByProp(param) == 1))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
     {
-        case AL_PITCH:
-        case AL_GAIN:
-        case AL_MIN_GAIN:
-        case AL_MAX_GAIN:
-        case AL_MAX_DISTANCE:
-        case AL_ROLLOFF_FACTOR:
-        case AL_CONE_OUTER_GAIN:
-        case AL_CONE_OUTER_GAINHF:
-        case AL_SEC_OFFSET:
-        case AL_SAMPLE_OFFSET:
-        case AL_BYTE_OFFSET:
-        case AL_CONE_INNER_ANGLE:
-        case AL_CONE_OUTER_ANGLE:
-        case AL_REFERENCE_DISTANCE:
-        case AL_AIR_ABSORPTION_FACTOR:
-        case AL_ROOM_ROLLOFF_FACTOR:
-        case AL_DOPPLER_FACTOR:
-            if(GetSourcedv(Source, Context, param, &dval) == AL_NO_ERROR)
-                *value = (ALfloat)dval;
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
+        ALdouble dval;
+        if(GetSourcedv(Source, Context, param, &dval) == AL_NO_ERROR)
+            *value = (ALfloat)dval;
     }
 
     ALCcontext_DecRef(Context);
@@ -1641,7 +1612,6 @@ AL_API ALvoid AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *va
 {
     ALCcontext *Context;
     ALsource   *Source;
-    ALdouble   dvals[3];
 
     Context = GetContextRef();
     if(!Context) return;
@@ -1650,21 +1620,17 @@ AL_API ALvoid AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *va
         alSetError(Context, AL_INVALID_NAME);
     else if(!(value1 && value2 && value3))
         alSetError(Context, AL_INVALID_VALUE);
-    else switch(param)
+    else if(!(FloatValsByProp(param) == 3))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
     {
-        case AL_POSITION:
-        case AL_VELOCITY:
-        case AL_DIRECTION:
-            if(GetSourcedv(Source, Context, param, dvals) == AL_NO_ERROR)
-            {
-                *value1 = (ALfloat)dvals[0];
-                *value2 = (ALfloat)dvals[1];
-                *value3 = (ALfloat)dvals[2];
-            }
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
+        ALdouble dvals[3];
+        if(GetSourcedv(Source, Context, param, dvals) == AL_NO_ERROR)
+        {
+            *value1 = (ALfloat)dvals[0];
+            *value2 = (ALfloat)dvals[1];
+            *value3 = (ALfloat)dvals[2];
+        }
     }
 
     ALCcontext_DecRef(Context);
@@ -1675,36 +1641,7 @@ AL_API ALvoid AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *va
 {
     ALCcontext *Context;
     ALsource   *Source;
-    ALdouble   dvals[2];
-
-    switch(param)
-    {
-        case AL_PITCH:
-        case AL_GAIN:
-        case AL_MIN_GAIN:
-        case AL_MAX_GAIN:
-        case AL_MAX_DISTANCE:
-        case AL_ROLLOFF_FACTOR:
-        case AL_DOPPLER_FACTOR:
-        case AL_CONE_OUTER_GAIN:
-        case AL_SEC_OFFSET:
-        case AL_SAMPLE_OFFSET:
-        case AL_BYTE_OFFSET:
-        case AL_CONE_INNER_ANGLE:
-        case AL_CONE_OUTER_ANGLE:
-        case AL_REFERENCE_DISTANCE:
-        case AL_CONE_OUTER_GAINHF:
-        case AL_AIR_ABSORPTION_FACTOR:
-        case AL_ROOM_ROLLOFF_FACTOR:
-            alGetSourcef(source, param, values);
-            return;
-
-        case AL_POSITION:
-        case AL_VELOCITY:
-        case AL_DIRECTION:
-            alGetSource3f(source, param, values+0, values+1, values+2);
-            return;
-    }
+    ALint      count;
 
     Context = GetContextRef();
     if(!Context) return;
@@ -1713,19 +1650,17 @@ AL_API ALvoid AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *va
         alSetError(Context, AL_INVALID_NAME);
     else if(!values)
         alSetError(Context, AL_INVALID_VALUE);
-    else switch(param)
+    else if(!((count=FloatValsByProp(param)) > 0 && count <= 3))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
     {
-        case AL_SAMPLE_RW_OFFSETS_SOFT:
-        case AL_BYTE_RW_OFFSETS_SOFT:
-            if(GetSourcedv(Source, Context, param, dvals) == AL_NO_ERROR)
-            {
-                values[0] = (ALfloat)dvals[0];
-                values[1] = (ALfloat)dvals[1];
-            }
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
+        ALdouble dvals[3];
+        if(GetSourcedv(Source, Context, param, dvals) == AL_NO_ERROR)
+        {
+            ALint i;
+            for(i = 0;i < count;i++)
+                values[i] = (ALfloat)dvals[i];
+        }
     }
 
     ALCcontext_DecRef(Context);
@@ -1744,31 +1679,10 @@ AL_API void AL_APIENTRY alGetSourcedSOFT(ALuint source, ALenum param, ALdouble *
         alSetError(Context, AL_INVALID_NAME);
     else if(!value)
         alSetError(Context, AL_INVALID_VALUE);
-    else switch(param)
-    {
-        case AL_PITCH:
-        case AL_GAIN:
-        case AL_MIN_GAIN:
-        case AL_MAX_GAIN:
-        case AL_MAX_DISTANCE:
-        case AL_ROLLOFF_FACTOR:
-        case AL_CONE_OUTER_GAIN:
-        case AL_CONE_OUTER_GAINHF:
-        case AL_SEC_OFFSET:
-        case AL_SAMPLE_OFFSET:
-        case AL_BYTE_OFFSET:
-        case AL_CONE_INNER_ANGLE:
-        case AL_CONE_OUTER_ANGLE:
-        case AL_REFERENCE_DISTANCE:
-        case AL_AIR_ABSORPTION_FACTOR:
-        case AL_ROOM_ROLLOFF_FACTOR:
-        case AL_DOPPLER_FACTOR:
-            GetSourcedv(Source, Context, param, value);
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
-    }
+    else if(!(DoubleValsByProp(param) == 1))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
+        GetSourcedv(Source, Context, param, value);
 
     ALCcontext_DecRef(Context);
 }
@@ -1777,7 +1691,6 @@ AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble
 {
     ALCcontext *Context;
     ALsource   *Source;
-    ALdouble   dvals[3];
 
     Context = GetContextRef();
     if(!Context) return;
@@ -1786,21 +1699,17 @@ AL_API void AL_APIENTRY alGetSource3dSOFT(ALuint source, ALenum param, ALdouble
         alSetError(Context, AL_INVALID_NAME);
     else if(!(value1 && value2 && value3))
         alSetError(Context, AL_INVALID_VALUE);
-    else switch(param)
+    else if(!(DoubleValsByProp(param) == 3))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
     {
-        case AL_POSITION:
-        case AL_VELOCITY:
-        case AL_DIRECTION:
-            if(GetSourcedv(Source, Context, param, dvals) == AL_NO_ERROR)
-            {
-                *value1 = dvals[0];
-                *value2 = dvals[1];
-                *value3 = dvals[2];
-            }
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
+        ALdouble dvals[3];
+        if(GetSourcedv(Source, Context, param, dvals) == AL_NO_ERROR)
+        {
+            *value1 = dvals[0];
+            *value2 = dvals[1];
+            *value3 = dvals[2];
+        }
     }
 
     ALCcontext_DecRef(Context);
@@ -1818,39 +1727,10 @@ AL_API void AL_APIENTRY alGetSourcedvSOFT(ALuint source, ALenum param, ALdouble
         alSetError(Context, AL_INVALID_NAME);
     else if(!values)
         alSetError(Context, AL_INVALID_VALUE);
-    else switch(param)
-    {
-        case AL_PITCH:
-        case AL_GAIN:
-        case AL_MIN_GAIN:
-        case AL_MAX_GAIN:
-        case AL_MAX_DISTANCE:
-        case AL_ROLLOFF_FACTOR:
-        case AL_DOPPLER_FACTOR:
-        case AL_CONE_OUTER_GAIN:
-        case AL_SEC_OFFSET:
-        case AL_SAMPLE_OFFSET:
-        case AL_BYTE_OFFSET:
-        case AL_CONE_INNER_ANGLE:
-        case AL_CONE_OUTER_ANGLE:
-        case AL_REFERENCE_DISTANCE:
-        case AL_CONE_OUTER_GAINHF:
-        case AL_AIR_ABSORPTION_FACTOR:
-        case AL_ROOM_ROLLOFF_FACTOR:
-
-        case AL_SAMPLE_RW_OFFSETS_SOFT:
-        case AL_BYTE_RW_OFFSETS_SOFT:
-        case AL_SEC_OFFSET_LATENCY_SOFT:
-
-        case AL_POSITION:
-        case AL_VELOCITY:
-        case AL_DIRECTION:
-            GetSourcedv(Source, Context, param, values);
-            break;
-
-        default:
-            alSetError(Context, AL_INVALID_ENUM);
-    }
+    else if(!(DoubleValsByProp(param) > 0))
+        alSetError(Context, AL_INVALID_ENUM);
+    else
+        GetSourcedv(Source, Context, param, values);
 
     ALCcontext_DecRef(Context);
 }