Use an enum to handle float source properties
This commit is contained in:
+127
-60
@@ -53,11 +53,59 @@ static ALdouble GetSourceSecOffset(const ALsource *Source);
|
||||
static ALvoid GetSourceOffsets(const ALsource *Source, ALenum name, ALdouble *offsets, ALdouble updateLen);
|
||||
static ALint GetSampleOffset(ALsource *Source);
|
||||
|
||||
static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, ALenum name, const ALfloat *values);
|
||||
typedef enum SrcFloatProp {
|
||||
sfvPitch = AL_PITCH,
|
||||
sfvGain = AL_GAIN,
|
||||
sfvMinGain = AL_MIN_GAIN,
|
||||
sfvMaxGain = AL_MAX_GAIN,
|
||||
sfvMaxDistance = AL_MAX_DISTANCE,
|
||||
sfvRolloffFactor = AL_ROLLOFF_FACTOR,
|
||||
sfvDopplerFactor = AL_DOPPLER_FACTOR,
|
||||
sfvConeOuterGain = AL_CONE_OUTER_GAIN,
|
||||
sfvSecOffset = AL_SEC_OFFSET,
|
||||
sfvSampleOffset = AL_SAMPLE_OFFSET,
|
||||
sfvByteOffset = AL_BYTE_OFFSET,
|
||||
sfvConeInnerAngle = AL_CONE_INNER_ANGLE,
|
||||
sfvConeOuterAngle = AL_CONE_OUTER_ANGLE,
|
||||
sfvRefDistance = AL_REFERENCE_DISTANCE,
|
||||
|
||||
sfvPosition = AL_POSITION,
|
||||
sfvVelocity = AL_VELOCITY,
|
||||
sfvDirection = AL_DIRECTION,
|
||||
|
||||
sfvSourceRelative = AL_SOURCE_RELATIVE,
|
||||
sfvLooping = AL_LOOPING,
|
||||
sfvBuffer = AL_BUFFER,
|
||||
sfvSourceState = AL_SOURCE_STATE,
|
||||
sfvBuffersQueued = AL_BUFFERS_QUEUED,
|
||||
sfvBuffersProcessed = AL_BUFFERS_PROCESSED,
|
||||
sfvSourceType = AL_SOURCE_TYPE,
|
||||
sfvDistanceModel = AL_DISTANCE_MODEL,
|
||||
|
||||
/* ALC_EXT_EFX */
|
||||
sfvConeOuterGainHF = AL_CONE_OUTER_GAINHF,
|
||||
sfvAirAbsorptionFactor = AL_AIR_ABSORPTION_FACTOR,
|
||||
sfvRoomRolloffFactor = AL_ROOM_ROLLOFF_FACTOR,
|
||||
sfvDirectFilterGainHFAuto = AL_DIRECT_FILTER_GAINHF_AUTO,
|
||||
sfvAuxSendFilterGainAuto = AL_AUXILIARY_SEND_FILTER_GAIN_AUTO,
|
||||
sfvAuxSendFilterGainHFAuto = AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO,
|
||||
|
||||
/* AL_SOFT_buffer_sub_data / AL_SOFT_buffer_samples */
|
||||
sfvSampleRWOffsetsSOFT = AL_SAMPLE_RW_OFFSETS_SOFT,
|
||||
sfvByteRWOffsetsSOFT = AL_BYTE_RW_OFFSETS_SOFT,
|
||||
|
||||
/* AL_SOFT_source_latency */
|
||||
sfvSecOffsetLatencySOFT = AL_SEC_OFFSET_LATENCY_SOFT,
|
||||
|
||||
/* AL_SOFT_direct_channels */
|
||||
sfvDirectChannelsSOFT = AL_DIRECT_CHANNELS_SOFT,
|
||||
} SrcFloatProp;
|
||||
|
||||
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 GetSourcedv(const ALsource *Source, ALCcontext *Context, ALenum name, ALdouble *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);
|
||||
|
||||
@@ -72,107 +120,109 @@ static ALenum GetSourcei64v(const ALsource *Source, ALCcontext *Context, ALenum
|
||||
RETERR(AL_INVALID_VALUE); \
|
||||
} while(0)
|
||||
|
||||
static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, ALenum name, const ALfloat *values)
|
||||
static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, SrcFloatProp prop, const ALfloat *values)
|
||||
{
|
||||
switch(name)
|
||||
ALint ival;
|
||||
|
||||
switch(prop)
|
||||
{
|
||||
case AL_PITCH:
|
||||
CHECKVAL(*values >= 0.0f);
|
||||
|
||||
Source->Pitch = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_CONE_INNER_ANGLE:
|
||||
CHECKVAL(*values >= 0.0f && *values <= 360.0f);
|
||||
|
||||
Source->InnerAngle = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_CONE_OUTER_ANGLE:
|
||||
CHECKVAL(*values >= 0.0f && *values <= 360.0f);
|
||||
|
||||
Source->OuterAngle = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_GAIN:
|
||||
CHECKVAL(*values >= 0.0f);
|
||||
|
||||
Source->Gain = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_MAX_DISTANCE:
|
||||
CHECKVAL(*values >= 0.0f);
|
||||
|
||||
Source->MaxDistance = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_ROLLOFF_FACTOR:
|
||||
CHECKVAL(*values >= 0.0f);
|
||||
|
||||
Source->RollOffFactor = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_REFERENCE_DISTANCE:
|
||||
CHECKVAL(*values >= 0.0f);
|
||||
|
||||
Source->RefDistance = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_MIN_GAIN:
|
||||
CHECKVAL(*values >= 0.0f && *values <= 1.0f);
|
||||
|
||||
Source->MinGain = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_MAX_GAIN:
|
||||
CHECKVAL(*values >= 0.0f && *values <= 1.0f);
|
||||
|
||||
Source->MaxGain = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_CONE_OUTER_GAIN:
|
||||
CHECKVAL(*values >= 0.0f && *values <= 1.0f);
|
||||
|
||||
Source->OuterGain = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_CONE_OUTER_GAINHF:
|
||||
CHECKVAL(*values >= 0.0f && *values <= 1.0f);
|
||||
|
||||
Source->OuterGainHF = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_AIR_ABSORPTION_FACTOR:
|
||||
CHECKVAL(*values >= 0.0f && *values <= 10.0f);
|
||||
|
||||
Source->AirAbsorptionFactor = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_ROOM_ROLLOFF_FACTOR:
|
||||
CHECKVAL(*values >= 0.0f && *values <= 10.0f);
|
||||
|
||||
Source->RoomRolloffFactor = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_DOPPLER_FACTOR:
|
||||
CHECKVAL(*values >= 0.0f && *values <= 1.0f);
|
||||
|
||||
Source->DopplerFactor = *values;
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_SEC_OFFSET:
|
||||
case AL_SAMPLE_OFFSET:
|
||||
@@ -180,7 +230,7 @@ static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, ALenum name, co
|
||||
CHECKVAL(*values >= 0.0f);
|
||||
|
||||
LockContext(Context);
|
||||
Source->OffsetType = name;
|
||||
Source->OffsetType = prop;
|
||||
Source->Offset = *values;
|
||||
|
||||
if((Source->state == AL_PLAYING || Source->state == AL_PAUSED) &&
|
||||
@@ -193,7 +243,7 @@ static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, ALenum name, co
|
||||
}
|
||||
}
|
||||
UnlockContext(Context);
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
|
||||
case AL_SEC_OFFSET_LATENCY_SOFT:
|
||||
@@ -210,7 +260,7 @@ static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, ALenum name, co
|
||||
Source->Position[2] = values[2];
|
||||
UnlockContext(Context);
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_VELOCITY:
|
||||
CHECKVAL(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2]));
|
||||
@@ -221,7 +271,7 @@ static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, ALenum name, co
|
||||
Source->Velocity[2] = values[2];
|
||||
UnlockContext(Context);
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_DIRECTION:
|
||||
CHECKVAL(isfinite(values[0]) && isfinite(values[1]) && isfinite(values[2]));
|
||||
@@ -232,14 +282,35 @@ static ALenum SetSourcefv(ALsource *Source, ALCcontext *Context, ALenum name, co
|
||||
Source->Orientation[2] = values[2];
|
||||
UnlockContext(Context);
|
||||
Source->NeedsUpdate = AL_TRUE;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
default:
|
||||
ERR("Unexpected param: 0x%04x\n", name);
|
||||
RETERR(AL_INVALID_ENUM);
|
||||
|
||||
case sfvSampleRWOffsetsSOFT:
|
||||
case sfvByteRWOffsetsSOFT:
|
||||
RETERR(AL_INVALID_OPERATION);
|
||||
|
||||
|
||||
case sfvSourceRelative:
|
||||
case sfvLooping:
|
||||
case sfvSourceState:
|
||||
case sfvSourceType:
|
||||
case sfvDistanceModel:
|
||||
case sfvDirectFilterGainHFAuto:
|
||||
case sfvAuxSendFilterGainAuto:
|
||||
case sfvAuxSendFilterGainHFAuto:
|
||||
case sfvDirectChannelsSOFT:
|
||||
ival = (ALint)values[0];
|
||||
return SetSourceiv(Source, Context, prop, &ival);
|
||||
|
||||
case sfvBuffer:
|
||||
case sfvBuffersQueued:
|
||||
case sfvBuffersProcessed:
|
||||
ival = (ALint)((ALuint)values[0]);
|
||||
return SetSourceiv(Source, Context, prop, &ival);
|
||||
}
|
||||
|
||||
return AL_NO_ERROR;
|
||||
ERR("Unexpected property: 0x%04x\n", prop);
|
||||
RETERR(AL_INVALID_ENUM);
|
||||
}
|
||||
|
||||
static ALenum SetSourceiv(ALsource *Source, ALCcontext *Context, ALenum name, const ALint *values)
|
||||
@@ -560,54 +631,54 @@ static ALenum SetSourcei64v(ALsource *Source, ALCcontext *Context, ALenum name,
|
||||
#undef CHECKVAL
|
||||
|
||||
|
||||
static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, ALenum name, ALdouble *values)
|
||||
static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, SrcFloatProp prop, ALdouble *values)
|
||||
{
|
||||
ALdouble offsets[2];
|
||||
ALdouble updateLen;
|
||||
ALint ivals[3];
|
||||
ALenum err;
|
||||
|
||||
switch(name)
|
||||
switch(prop)
|
||||
{
|
||||
case AL_GAIN:
|
||||
*values = Source->Gain;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_PITCH:
|
||||
*values = Source->Pitch;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_MAX_DISTANCE:
|
||||
*values = Source->MaxDistance;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_ROLLOFF_FACTOR:
|
||||
*values = Source->RollOffFactor;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_REFERENCE_DISTANCE:
|
||||
*values = Source->RefDistance;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_CONE_INNER_ANGLE:
|
||||
*values = Source->InnerAngle;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_CONE_OUTER_ANGLE:
|
||||
*values = Source->OuterAngle;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_MIN_GAIN:
|
||||
*values = Source->MinGain;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_MAX_GAIN:
|
||||
*values = Source->MaxGain;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_CONE_OUTER_GAIN:
|
||||
*values = Source->OuterGain;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_SEC_OFFSET:
|
||||
case AL_SAMPLE_OFFSET:
|
||||
@@ -615,35 +686,35 @@ static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, ALenum na
|
||||
LockContext(Context);
|
||||
updateLen = (ALdouble)Context->Device->UpdateSize /
|
||||
Context->Device->Frequency;
|
||||
GetSourceOffsets(Source, name, offsets, updateLen);
|
||||
GetSourceOffsets(Source, prop, offsets, updateLen);
|
||||
UnlockContext(Context);
|
||||
*values = offsets[0];
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_CONE_OUTER_GAINHF:
|
||||
*values = Source->OuterGainHF;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_AIR_ABSORPTION_FACTOR:
|
||||
*values = Source->AirAbsorptionFactor;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_ROOM_ROLLOFF_FACTOR:
|
||||
*values = Source->RoomRolloffFactor;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_DOPPLER_FACTOR:
|
||||
*values = Source->DopplerFactor;
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_SAMPLE_RW_OFFSETS_SOFT:
|
||||
case AL_BYTE_RW_OFFSETS_SOFT:
|
||||
LockContext(Context);
|
||||
updateLen = (ALdouble)Context->Device->UpdateSize /
|
||||
Context->Device->Frequency;
|
||||
GetSourceOffsets(Source, name, values, updateLen);
|
||||
GetSourceOffsets(Source, prop, values, updateLen);
|
||||
UnlockContext(Context);
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_SEC_OFFSET_LATENCY_SOFT:
|
||||
LockContext(Context);
|
||||
@@ -651,7 +722,7 @@ static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, ALenum na
|
||||
values[1] = (ALdouble)ALCdevice_GetLatency(Context->Device) /
|
||||
1000000000.0;
|
||||
UnlockContext(Context);
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_POSITION:
|
||||
LockContext(Context);
|
||||
@@ -659,7 +730,7 @@ static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, ALenum na
|
||||
values[1] = Source->Position[1];
|
||||
values[2] = Source->Position[2];
|
||||
UnlockContext(Context);
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_VELOCITY:
|
||||
LockContext(Context);
|
||||
@@ -667,7 +738,7 @@ static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, ALenum na
|
||||
values[1] = Source->Velocity[1];
|
||||
values[2] = Source->Velocity[2];
|
||||
UnlockContext(Context);
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_DIRECTION:
|
||||
LockContext(Context);
|
||||
@@ -675,7 +746,7 @@ static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, ALenum na
|
||||
values[1] = Source->Orientation[1];
|
||||
values[2] = Source->Orientation[2];
|
||||
UnlockContext(Context);
|
||||
break;
|
||||
return AL_NO_ERROR;
|
||||
|
||||
case AL_SOURCE_RELATIVE:
|
||||
case AL_LOOPING:
|
||||
@@ -689,17 +760,13 @@ static ALenum GetSourcedv(const ALsource *Source, ALCcontext *Context, ALenum na
|
||||
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 = (ALdouble)ivals[0];
|
||||
break;
|
||||
|
||||
default:
|
||||
ERR("Unexpected param: 0x%04x\n", name);
|
||||
RETERR(AL_INVALID_ENUM);
|
||||
if((err=GetSourceiv(Source, Context, (int)prop, ivals)) == AL_NO_ERROR)
|
||||
*values = (ALdouble)ivals[0];
|
||||
return err;
|
||||
}
|
||||
|
||||
return AL_NO_ERROR;
|
||||
ERR("Unexpected property: 0x%04x\n", prop);
|
||||
RETERR(AL_INVALID_ENUM);
|
||||
}
|
||||
|
||||
static ALenum GetSourceiv(const ALsource *Source, ALCcontext *Context, ALenum name, ALint *values)
|
||||
|
||||
Reference in New Issue
Block a user