Use an enum to handle int source properties

This commit is contained in:
Chris Robinson 2012-12-05 09:55:05 -08:00
parent 5e14a83030
commit ed5738bfa4

View File

@ -101,13 +101,55 @@ typedef enum SrcFloatProp {
sfvDirectChannelsSOFT = AL_DIRECT_CHANNELS_SOFT,
} SrcFloatProp;
typedef enum SrcIntProp {
sivMaxDistance = AL_MAX_DISTANCE,
sivRolloffFactor = AL_ROLLOFF_FACTOR,
sivRefDistance = AL_REFERENCE_DISTANCE,
sivSourceRelative = AL_SOURCE_RELATIVE,
sivConeInnerAngle = AL_CONE_INNER_ANGLE,
sivConeOuterAngle = AL_CONE_OUTER_ANGLE,
sivLooping = AL_LOOPING,
sivBuffer = AL_BUFFER,
sivSourceState = AL_SOURCE_STATE,
sivBuffersQueued = AL_BUFFERS_QUEUED,
sivBuffersProcessed = AL_BUFFERS_PROCESSED,
sivSourceType = AL_SOURCE_TYPE,
sivSecOffset = AL_SEC_OFFSET,
sivSampleOffset = AL_SAMPLE_OFFSET,
sivByteOffset = AL_BYTE_OFFSET,
sivDopplerFactor = AL_DOPPLER_FACTOR,
sivPosition = AL_POSITION,
sivVelocity = AL_VELOCITY,
sivDirection = AL_DIRECTION,
/* ALC_EXT_EFX */
sivDirectFilterGainHFAuto = AL_DIRECT_FILTER_GAINHF_AUTO,
sivAuxSendFilterGainAutio = AL_AUXILIARY_SEND_FILTER_GAIN_AUTO,
sivAuxSendFilterGainHFAuto = AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO,
sivDirectFilter = AL_DIRECT_FILTER,
sivAuxSendFilter = AL_AUXILIARY_SEND_FILTER,
/* AL_SOFT_direct_channels */
sivDirectChannelsSOFT = AL_DIRECT_CHANNELS_SOFT,
/* AL_EXT_source_distance_model */
sivDistanceModel = AL_DISTANCE_MODEL,
/* AL_SOFT_buffer_sub_data / AL_SOFT_buffer_samples */
sivSampleRWOffsetsSOFT = AL_SAMPLE_RW_OFFSETS_SOFT,
sivByteRWOffsetsSOFT = AL_BYTE_RW_OFFSETS_SOFT,
/* AL_SOFT_source_latency */
sivSampleOffsetLatencySOFT = AL_SAMPLE_OFFSET_LATENCY_SOFT,
} SrcIntProp;
static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, SrcFloatProp prop, 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 SetSourceiv(ALsource *Source, ALCcontext *Context, SrcIntProp prop, const ALint *values);
static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, SrcIntProp prop, const ALint64SOFT *values);
static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, SrcFloatProp prop, ALdouble *values);
static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, ALenum name, ALint *values);
static ALenum GetSourcei64v(const ALsource *Source, ALCcontext *Context, ALenum name, ALint64 *values);
static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, SrcIntProp prop, ALint *values);
static ALenum GetSourcei64v(const ALsource *Source, ALCcontext *Context, SrcIntProp prop, ALint64 *values);
#define RETERR(x) do { \
@ -313,7 +355,7 @@ static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, SrcFloatProp pr
RETERR(AL_INVALID_ENUM);
}
static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, const ALint *values)
static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, SrcIntProp prop, const ALint *values)
{
ALCdevice *device = Context->Device;
ALbuffer *buffer = NULL;
@ -321,22 +363,21 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
ALeffectslot *slot = NULL;
ALbufferlistitem *oldlist;
ALfloat fvals[3];
ALenum err;
switch(name)
switch(prop)
{
case AL_SOURCE_RELATIVE:
CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
Source->HeadRelative = (ALboolean)*values;
Source->NeedsUpdate = AL_TRUE;
break;
return AL_NO_ERROR;
case AL_LOOPING:
CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
Source->Looping = (ALboolean)*values;
break;
return AL_NO_ERROR;
case AL_BUFFER:
CHECKVAL(*values == 0 || (buffer=LookupBuffer(device, *values)) != NULL);
@ -396,9 +437,12 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
free(temp);
}
UnlockContext(Context);
break;
return AL_NO_ERROR;
case AL_SOURCE_STATE:
case sivSourceState:
case sivSourceType:
case sivBuffersQueued:
case sivBuffersProcessed:
/* Query only */
RETERR(AL_INVALID_OPERATION);
@ -408,7 +452,7 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
CHECKVAL(*values >= 0);
LockContext(Context);
Source->OffsetType = name;
Source->OffsetType = prop;
Source->Offset = *values;
if((Source->state == AL_PLAYING || Source->state == AL_PAUSED) &&
@ -421,7 +465,15 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
}
}
UnlockContext(Context);
break;
return AL_NO_ERROR;
case sivSampleRWOffsetsSOFT:
case sivByteRWOffsetsSOFT:
case sivSampleOffsetLatencySOFT:
/* Query only */
RETERR(AL_INVALID_OPERATION);
case AL_DIRECT_FILTER:
CHECKVAL(*values == 0 || (filter=LookupFilter(device, *values)) != NULL);
@ -439,35 +491,35 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
}
UnlockContext(Context);
Source->NeedsUpdate = AL_TRUE;
break;
return AL_NO_ERROR;
case AL_DIRECT_FILTER_GAINHF_AUTO:
CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
Source->DryGainHFAuto = *values;
Source->NeedsUpdate = AL_TRUE;
break;
return AL_NO_ERROR;
case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO:
CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
Source->WetGainAuto = *values;
Source->NeedsUpdate = AL_TRUE;
break;
return AL_NO_ERROR;
case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO:
CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
Source->WetGainHFAuto = *values;
Source->NeedsUpdate = AL_TRUE;
break;
return AL_NO_ERROR;
case AL_DIRECT_CHANNELS_SOFT:
CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
Source->DirectChannels = *values;
Source->NeedsUpdate = AL_TRUE;
break;
return AL_NO_ERROR;
case AL_DISTANCE_MODEL:
CHECKVAL(*values == AL_NONE ||
@ -481,7 +533,7 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
Source->DistanceModel = *values;
if(Context->SourceDistanceModel)
Source->NeedsUpdate = AL_TRUE;
break;
return AL_NO_ERROR;
case AL_AUXILIARY_SEND_FILTER:
@ -512,7 +564,7 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
}
Source->NeedsUpdate = AL_TRUE;
UnlockContext(Context);
break;
return AL_NO_ERROR;
case AL_MAX_DISTANCE:
@ -520,10 +572,9 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
case AL_CONE_INNER_ANGLE:
case AL_CONE_OUTER_ANGLE:
case AL_REFERENCE_DISTANCE:
case sivDopplerFactor:
fvals[0] = (ALfloat)*values;
if((err=SetSourcefv(Source, Context, name, fvals)) != AL_NO_ERROR)
return err;
break;
return SetSourcefv(Source, Context, (int)prop, fvals);
case AL_POSITION:
case AL_VELOCITY:
@ -531,27 +582,23 @@ static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, co
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:
ERR("Unexpected param: 0x%04x\n", name);
RETERR(AL_INVALID_ENUM);
return SetSourcefv(Source, Context, (int)prop, fvals);
}
return AL_NO_ERROR;
ERR("Unexpected property: 0x%04x\n", prop);
RETERR(AL_INVALID_ENUM);
}
static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name, const ALint64SOFT *values)
static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, SrcIntProp prop, const ALint64SOFT *values)
{
ALfloat fvals[3];
ALint ivals[3];
ALenum err;
switch(name)
switch(prop)
{
case AL_SAMPLE_OFFSET_LATENCY_SOFT:
case sivSampleRWOffsetsSOFT:
case sivByteRWOffsetsSOFT:
case sivSampleOffsetLatencySOFT:
/* Query only */
RETERR(AL_INVALID_OPERATION);
@ -562,6 +609,9 @@ static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name,
case AL_SOURCE_STATE:
case AL_BYTE_OFFSET:
case AL_SAMPLE_OFFSET:
case sivSourceType:
case sivBuffersQueued:
case sivBuffersProcessed:
case AL_DIRECT_FILTER_GAINHF_AUTO:
case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO:
case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO:
@ -570,9 +620,7 @@ static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name,
CHECKVAL(*values <= INT_MAX && *values >= INT_MIN);
ivals[0] = (ALint)*values;
if((err=SetSourceiv(Source, Context, name, ivals)))
return err;
break;
return SetSourceiv(Source, Context, (int)prop, ivals);
/* 1x uint */
case AL_BUFFER:
@ -580,9 +628,7 @@ static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name,
CHECKVAL(*values <= UINT_MAX && *values >= 0);
ivals[0] = (ALuint)*values;
if((err=SetSourceiv(Source, Context, name, ivals)))
return err;
break;
return SetSourceiv(Source, Context, (int)prop, ivals);
/* 3x uint */
case AL_AUXILIARY_SEND_FILTER:
@ -593,9 +639,7 @@ static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name,
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;
return SetSourceiv(Source, Context, (int)prop, ivals);
/* 1x float */
case AL_MAX_DISTANCE:
@ -604,10 +648,9 @@ static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name,
case AL_CONE_OUTER_ANGLE:
case AL_REFERENCE_DISTANCE:
case AL_SEC_OFFSET:
case sivDopplerFactor:
fvals[0] = (ALfloat)*values;
if((err=SetSourcefv(Source, Context, name, fvals)) != AL_NO_ERROR)
return err;
break;
return SetSourcefv(Source, Context, (int)prop, fvals);
/* 3x float */
case AL_POSITION:
@ -616,16 +659,11 @@ static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name,
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:
ERR("Unexpected param: 0x%04x\n", name);
RETERR(AL_INVALID_ENUM);
return SetSourcefv(Source, Context, (int)prop, fvals);
}
return AL_NO_ERROR;
ERR("Unexpected property: 0x%04x\n", prop);
RETERR(AL_INVALID_ENUM);
}
#undef CHECKVAL
@ -769,21 +807,21 @@ static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, SrcFloatP
RETERR(AL_INVALID_ENUM);
}
static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, ALenum name, ALint *values)
static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, SrcIntProp prop, ALint *values)
{
ALbufferlistitem *BufferList;
ALdouble dvals[3];
ALenum err;
switch(name)
switch(prop)
{
case AL_SOURCE_RELATIVE:
*values = Source->HeadRelative;
break;
return AL_NO_ERROR;
case AL_LOOPING:
*values = Source->Looping;
break;
return AL_NO_ERROR;
case AL_BUFFER:
LockContext(Context);
@ -800,15 +838,15 @@ static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, ALenum na
*values = ((BufferList && BufferList->buffer) ?
BufferList->buffer->id : 0);
UnlockContext(Context);
break;
return AL_NO_ERROR;
case AL_SOURCE_STATE:
*values = Source->state;
break;
return AL_NO_ERROR;
case AL_BUFFERS_QUEUED:
*values = Source->BuffersInQueue;
break;
return AL_NO_ERROR;
case AL_BUFFERS_PROCESSED:
LockContext(Context);
@ -821,31 +859,31 @@ static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, ALenum na
else
*values = Source->BuffersPlayed;
UnlockContext(Context);
break;
return AL_NO_ERROR;
case AL_SOURCE_TYPE:
*values = Source->SourceType;
break;
return AL_NO_ERROR;
case AL_DIRECT_FILTER_GAINHF_AUTO:
*values = Source->DryGainHFAuto;
break;
return AL_NO_ERROR;
case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO:
*values = Source->WetGainAuto;
break;
return AL_NO_ERROR;
case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO:
*values = Source->WetGainHFAuto;
break;
return AL_NO_ERROR;
case AL_DIRECT_CHANNELS_SOFT:
*values = Source->DirectChannels;
break;
return AL_NO_ERROR;
case AL_DISTANCE_MODEL:
*values = Source->DistanceModel;
break;
return AL_NO_ERROR;
case AL_MAX_DISTANCE:
case AL_ROLLOFF_FACTOR:
@ -856,51 +894,58 @@ static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, ALenum na
case AL_SAMPLE_OFFSET:
case AL_BYTE_OFFSET:
case AL_DOPPLER_FACTOR:
if((err=GetSourcedv(Source, Context, name, dvals)) != AL_NO_ERROR)
return err;
*values = (ALint)dvals[0];
break;
if((err=GetSourcedv(Source, Context, (int)prop, dvals)) == AL_NO_ERROR)
*values = (ALint)dvals[0];
return err;
case AL_SAMPLE_RW_OFFSETS_SOFT:
case AL_BYTE_RW_OFFSETS_SOFT:
if((err=GetSourcedv(Source, Context, name, dvals)) != AL_NO_ERROR)
return err;
values[0] = (ALint)dvals[0];
values[1] = (ALint)dvals[1];
break;
if((err=GetSourcedv(Source, Context, (int)prop, dvals)) == AL_NO_ERROR)
{
values[0] = (ALint)dvals[0];
values[1] = (ALint)dvals[1];
}
return err;
case AL_POSITION:
case AL_VELOCITY:
case AL_DIRECTION:
if((err=GetSourcedv(Source, Context, name, dvals)) != AL_NO_ERROR)
return err;
values[0] = (ALint)dvals[0];
values[1] = (ALint)dvals[1];
values[2] = (ALint)dvals[2];
if((err=GetSourcedv(Source, Context, (int)prop, dvals)) == AL_NO_ERROR)
{
values[0] = (ALint)dvals[0];
values[1] = (ALint)dvals[1];
values[2] = (ALint)dvals[2];
}
return err;
case sivSampleOffsetLatencySOFT:
/* i64 only */
break;
default:
ERR("Unexpected param: 0x%04x\n", name);
RETERR(AL_INVALID_ENUM);
case sivDirectFilter:
case sivAuxSendFilter:
/* ??? */
break;
}
return AL_NO_ERROR;
ERR("Unexpected property: 0x%04x\n", prop);
RETERR(AL_INVALID_ENUM);
}
static ALenum GetSourcei64v(const ALsource *Source, ALCcontext *Context, ALenum name, ALint64 *values)
static ALenum GetSourcei64v(const ALsource *Source, ALCcontext *Context, SrcIntProp prop, ALint64 *values)
{
ALdouble dvals[3];
ALint ivals[3];
ALenum err;
switch(name)
switch(prop)
{
case AL_SAMPLE_OFFSET_LATENCY_SOFT:
LockContext(Context);
values[0] = GetSourceOffset(Source);
values[1] = ALCdevice_GetLatency(Context->Device);
UnlockContext(Context);
break;
return AL_NO_ERROR;
case AL_MAX_DISTANCE:
case AL_ROLLOFF_FACTOR:
@ -911,28 +956,29 @@ static ALenum GetSourcei64v(const ALsource *Source, ALCcontext *Context, ALenum
case AL_SAMPLE_OFFSET:
case AL_BYTE_OFFSET:
case AL_DOPPLER_FACTOR:
if((err=GetSourcedv(Source, Context, name, dvals)) != AL_NO_ERROR)
return err;
*values = (ALint64)dvals[0];
break;
if((err=GetSourcedv(Source, Context, (int)prop, dvals)) == AL_NO_ERROR)
*values = (ALint64)dvals[0];
return err;
case AL_SAMPLE_RW_OFFSETS_SOFT:
case AL_BYTE_RW_OFFSETS_SOFT:
if((err=GetSourcedv(Source, Context, name, dvals)) != AL_NO_ERROR)
return err;
values[0] = (ALint64)dvals[0];
values[1] = (ALint64)dvals[1];
break;
if((err=GetSourcedv(Source, Context, (int)prop, dvals)) == AL_NO_ERROR)
{
values[0] = (ALint64)dvals[0];
values[1] = (ALint64)dvals[1];
}
return err;
case AL_POSITION:
case AL_VELOCITY:
case AL_DIRECTION:
if((err=GetSourcedv(Source, Context, name, dvals)) != AL_NO_ERROR)
return err;
values[0] = (ALint64)dvals[0];
values[1] = (ALint64)dvals[1];
values[2] = (ALint64)dvals[2];
break;
if((err=GetSourcedv(Source, Context, (int)prop, dvals)) == AL_NO_ERROR)
{
values[0] = (ALint64)dvals[0];
values[1] = (ALint64)dvals[1];
values[2] = (ALint64)dvals[2];
}
return err;
case AL_SOURCE_RELATIVE:
case AL_LOOPING:
@ -946,17 +992,18 @@ static ALenum GetSourcei64v(const ALsource *Source, ALCcontext *Context, ALenum
case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO:
case AL_DIRECT_CHANNELS_SOFT:
case AL_DISTANCE_MODEL:
if((err=GetSourceiv(Source, Context, name, ivals)) != AL_NO_ERROR)
return err;
*values = ivals[0];
break;
if((err=GetSourceiv(Source, Context, (int)prop, ivals)) == AL_NO_ERROR)
*values = ivals[0];
return err;
default:
ERR("Unexpected param: 0x%04x\n", name);
RETERR(AL_INVALID_ENUM);
/* ??? */
case sivDirectFilter:
case sivAuxSendFilter:
break;
}
return AL_NO_ERROR;
ERR("Unexpected property: 0x%04x\n", prop);
RETERR(AL_INVALID_ENUM);
}
#undef RETERR