aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--al/source.cpp431
1 files changed, 212 insertions, 219 deletions
diff --git a/al/source.cpp b/al/source.cpp
index a021cd1a..043ef940 100644
--- a/al/source.cpp
+++ b/al/source.cpp
@@ -985,28 +985,38 @@ ALint Int64ValsByProp(ALenum prop)
}
-ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALfloat *values);
-ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint *values);
-ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint64SOFT *values);
+bool SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span<const ALfloat> values);
+bool SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span<const ALint> values);
+bool SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span<const ALint64SOFT> values);
+#define CHECKSIZE(v, s) do { \
+ if(UNLIKELY((v).size() != INT_MAX && (v).size() != (s))) \
+ { \
+ Context->setError(AL_INVALID_ENUM, \
+ "Property 0x%04x expects %d value(s), got %zu", prop, (s), \
+ (v).size()); \
+ return false; \
+ } \
+} while(0)
#define CHECKVAL(x) do { \
- if(!(x)) \
+ if(UNLIKELY(!(x))) \
{ \
Context->setError(AL_INVALID_VALUE, "Value out of range"); \
- return AL_FALSE; \
+ return false; \
} \
} while(0)
-void UpdateSourceProps(ALsource *source, ALCcontext *context)
+bool UpdateSourceProps(ALsource *source, ALCcontext *context)
{
ALvoice *voice;
if(SourceShouldUpdate(source, context) && (voice=GetSourceVoice(source, context)) != nullptr)
UpdateSourceProps(source, voice, context);
else
source->PropsClean.clear(std::memory_order_release);
+ return true;
}
-ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALfloat *values)
+bool SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span<const ALfloat> values)
{
ALint ival;
@@ -1015,114 +1025,115 @@ ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
case AL_SEC_OFFSET_LATENCY_SOFT:
case AL_SEC_OFFSET_CLOCK_SOFT:
/* Query only */
- SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE,
- "Setting read-only source property 0x%04x", prop);
+ SETERR_RETURN(Context, AL_INVALID_OPERATION, false,
+ "Setting read-only source property 0x%04x", prop);
case AL_PITCH:
- CHECKVAL(*values >= 0.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f);
- Source->Pitch = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->Pitch = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_CONE_INNER_ANGLE:
- CHECKVAL(*values >= 0.0f && *values <= 360.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f && values[0] <= 360.0f);
- Source->InnerAngle = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->InnerAngle = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_CONE_OUTER_ANGLE:
- CHECKVAL(*values >= 0.0f && *values <= 360.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f && values[0] <= 360.0f);
- Source->OuterAngle = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->OuterAngle = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_GAIN:
- CHECKVAL(*values >= 0.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f);
- Source->Gain = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->Gain = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_MAX_DISTANCE:
- CHECKVAL(*values >= 0.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f);
- Source->MaxDistance = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->MaxDistance = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_ROLLOFF_FACTOR:
- CHECKVAL(*values >= 0.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f);
- Source->RolloffFactor = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->RolloffFactor = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_REFERENCE_DISTANCE:
- CHECKVAL(*values >= 0.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f);
- Source->RefDistance = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->RefDistance = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_MIN_GAIN:
- CHECKVAL(*values >= 0.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f);
- Source->MinGain = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->MinGain = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_MAX_GAIN:
- CHECKVAL(*values >= 0.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f);
- Source->MaxGain = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->MaxGain = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_CONE_OUTER_GAIN:
- CHECKVAL(*values >= 0.0f && *values <= 1.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f && values[0] <= 1.0f);
- Source->OuterGain = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->OuterGain = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_CONE_OUTER_GAINHF:
- CHECKVAL(*values >= 0.0f && *values <= 1.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f && values[0] <= 1.0f);
- Source->OuterGainHF = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->OuterGainHF = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_AIR_ABSORPTION_FACTOR:
- CHECKVAL(*values >= 0.0f && *values <= 10.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f && values[0] <= 10.0f);
- Source->AirAbsorptionFactor = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->AirAbsorptionFactor = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_ROOM_ROLLOFF_FACTOR:
- CHECKVAL(*values >= 0.0f && *values <= 10.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f && values[0] <= 10.0f);
- Source->RoomRolloffFactor = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->RoomRolloffFactor = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_DOPPLER_FACTOR:
- CHECKVAL(*values >= 0.0f && *values <= 1.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f && values[0] <= 1.0f);
- Source->DopplerFactor = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->DopplerFactor = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_SEC_OFFSET:
case AL_SAMPLE_OFFSET:
case AL_BYTE_OFFSET:
- CHECKVAL(*values >= 0.0f);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f);
Source->OffsetType = prop;
- Source->Offset = *values;
+ Source->Offset = values[0];
if(IsPlayingOrPaused(Source))
{
@@ -1134,55 +1145,56 @@ ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
if(ALvoice *voice{GetSourceVoice(Source, Context)})
{
if(ApplyOffset(Source, voice) == AL_FALSE)
- SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid offset");
+ SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid offset");
}
}
- return AL_TRUE;
+ return true;
case AL_SOURCE_RADIUS:
- CHECKVAL(*values >= 0.0f && std::isfinite(*values));
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0.0f && std::isfinite(values[0]));
- Source->Radius = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->Radius = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_STEREO_ANGLES:
+ CHECKSIZE(values, 2);
CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1]));
Source->StereoPan[0] = values[0];
Source->StereoPan[1] = values[1];
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ return UpdateSourceProps(Source, Context);
case AL_POSITION:
+ CHECKSIZE(values, 3);
CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1]) && std::isfinite(values[2]));
Source->Position[0] = values[0];
Source->Position[1] = values[1];
Source->Position[2] = values[2];
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ return UpdateSourceProps(Source, Context);
case AL_VELOCITY:
+ CHECKSIZE(values, 3);
CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1]) && std::isfinite(values[2]));
Source->Velocity[0] = values[0];
Source->Velocity[1] = values[1];
Source->Velocity[2] = values[2];
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ return UpdateSourceProps(Source, Context);
case AL_DIRECTION:
+ CHECKSIZE(values, 3);
CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1]) && std::isfinite(values[2]));
Source->Direction[0] = values[0];
Source->Direction[1] = values[1];
Source->Direction[2] = values[2];
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ return UpdateSourceProps(Source, Context);
case AL_ORIENTATION:
+ CHECKSIZE(values, 6);
CHECKVAL(std::isfinite(values[0]) && std::isfinite(values[1]) && std::isfinite(values[2]) &&
std::isfinite(values[3]) && std::isfinite(values[4]) && std::isfinite(values[5]));
@@ -1192,8 +1204,7 @@ ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
Source->OrientUp[0] = values[3];
Source->OrientUp[1] = values[4];
Source->OrientUp[2] = values[5];
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ return UpdateSourceProps(Source, Context);
case AL_SOURCE_RELATIVE:
@@ -1207,13 +1218,15 @@ ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
case AL_DIRECT_CHANNELS_SOFT:
case AL_SOURCE_RESAMPLER_SOFT:
case AL_SOURCE_SPATIALIZE_SOFT:
+ CHECKSIZE(values, 1);
ival = static_cast<ALint>(values[0]);
- return SetSourceiv(Source, Context, prop, &ival);
+ return SetSourceiv(Source, Context, prop, {&ival, 1u});
case AL_BUFFERS_QUEUED:
case AL_BUFFERS_PROCESSED:
+ CHECKSIZE(values, 1);
ival = static_cast<ALint>(static_cast<ALuint>(values[0]));
- return SetSourceiv(Source, Context, prop, &ival);
+ return SetSourceiv(Source, Context, prop, {&ival, 1u});
case AL_BUFFER:
case AL_DIRECT_FILTER:
@@ -1225,10 +1238,10 @@ ALboolean SetSourcefv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
ERR("Unexpected property: 0x%04x\n", prop);
Context->setError(AL_INVALID_ENUM, "Invalid source float property 0x%04x", prop);
- return AL_FALSE;
+ return false;
}
-ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint *values)
+bool SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span<const ALint> values)
{
ALCdevice *device{Context->mDevice.get()};
ALbuffer *buffer{nullptr};
@@ -1247,24 +1260,24 @@ ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
case AL_BUFFERS_QUEUED:
case AL_BUFFERS_PROCESSED:
/* Query only */
- SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE,
- "Setting read-only source property 0x%04x", prop);
+ SETERR_RETURN(Context, AL_INVALID_OPERATION, false,
+ "Setting read-only source property 0x%04x", prop);
case AL_SOURCE_RELATIVE:
- CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE);
- Source->HeadRelative = static_cast<ALboolean>(*values);
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->HeadRelative = static_cast<ALboolean>(values[0]);
+ return UpdateSourceProps(Source, Context);
case AL_LOOPING:
- CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE);
- Source->Looping = static_cast<ALboolean>(*values);
+ Source->Looping = static_cast<ALboolean>(values[0]);
if(IsPlayingOrPaused(Source))
{
- ALvoice *voice{GetSourceVoice(Source, Context)};
- if(voice)
+ if(ALvoice *voice{GetSourceVoice(Source, Context)})
{
if(Source->Looping)
voice->mLoopBuffer.store(Source->queue, std::memory_order_release);
@@ -1279,24 +1292,24 @@ ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
std::this_thread::yield();
}
}
- return AL_TRUE;
+ return true;
case AL_BUFFER:
+ CHECKSIZE(values, 1);
buflock = std::unique_lock<std::mutex>{device->BufferLock};
- if(!(*values == 0 || (buffer=LookupBuffer(device, *values)) != nullptr))
- SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid buffer ID %u",
- *values);
+ if(!(values[0] == 0 || (buffer=LookupBuffer(device, values[0])) != nullptr))
+ SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid buffer ID %u", values[0]);
if(buffer && buffer->MappedAccess != 0 &&
!(buffer->MappedAccess&AL_MAP_PERSISTENT_BIT_SOFT))
- SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE,
- "Setting non-persistently mapped buffer %u", buffer->id);
+ SETERR_RETURN(Context, AL_INVALID_OPERATION, false,
+ "Setting non-persistently mapped buffer %u", buffer->id);
else
{
ALenum state = GetSourceState(Source, GetSourceVoice(Source, Context));
if(state == AL_PLAYING || state == AL_PAUSED)
- SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE,
- "Setting buffer on playing or paused source %u", Source->id);
+ SETERR_RETURN(Context, AL_INVALID_OPERATION, false,
+ "Setting buffer on playing or paused source %u", Source->id);
}
oldlist = Source->queue;
@@ -1334,15 +1347,16 @@ ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
{ if(buffer) DecrementRef(buffer->ref); });
al_free(temp);
}
- return AL_TRUE;
+ return true;
case AL_SEC_OFFSET:
case AL_SAMPLE_OFFSET:
case AL_BYTE_OFFSET:
- CHECKVAL(*values >= 0);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0);
Source->OffsetType = prop;
- Source->Offset = *values;
+ Source->Offset = values[0];
if(IsPlayingOrPaused(Source))
{
@@ -1351,17 +1365,16 @@ ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
if(ALvoice *voice{GetSourceVoice(Source, Context)})
{
if(ApplyOffset(Source, voice) == AL_FALSE)
- SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE,
- "Invalid source offset");
+ SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid source offset");
}
}
- return AL_TRUE;
+ return true;
case AL_DIRECT_FILTER:
+ CHECKSIZE(values, 1);
filtlock = std::unique_lock<std::mutex>{device->FilterLock};
- if(!(*values == 0 || (filter=LookupFilter(device, *values)) != nullptr))
- SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid filter ID %u",
- *values);
+ if(!(values[0] == 0 || (filter=LookupFilter(device, values[0])) != nullptr))
+ SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid filter ID %u", values[0]);
if(!filter)
{
@@ -1380,78 +1393,74 @@ ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
Source->Direct.LFReference = filter->LFReference;
}
filtlock.unlock();
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ return UpdateSourceProps(Source, Context);
case AL_DIRECT_FILTER_GAINHF_AUTO:
- CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE);
- Source->DryGainHFAuto = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->DryGainHFAuto = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO:
- CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE);
- Source->WetGainAuto = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->WetGainAuto = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO:
- CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE);
- Source->WetGainHFAuto = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->WetGainHFAuto = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_DIRECT_CHANNELS_SOFT:
- CHECKVAL(*values == AL_FALSE || *values == AL_TRUE);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] == AL_FALSE || values[0] == AL_TRUE);
- Source->DirectChannels = *values;
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->DirectChannels = values[0];
+ return UpdateSourceProps(Source, Context);
case AL_DISTANCE_MODEL:
- CHECKVAL(*values == AL_NONE ||
- *values == AL_INVERSE_DISTANCE ||
- *values == AL_INVERSE_DISTANCE_CLAMPED ||
- *values == AL_LINEAR_DISTANCE ||
- *values == AL_LINEAR_DISTANCE_CLAMPED ||
- *values == AL_EXPONENT_DISTANCE ||
- *values == AL_EXPONENT_DISTANCE_CLAMPED);
-
- Source->mDistanceModel = static_cast<DistanceModel>(*values);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] == AL_NONE ||
+ values[0] == AL_INVERSE_DISTANCE || values[0] == AL_INVERSE_DISTANCE_CLAMPED ||
+ values[0] == AL_LINEAR_DISTANCE || values[0] == AL_LINEAR_DISTANCE_CLAMPED ||
+ values[0] == AL_EXPONENT_DISTANCE || values[0] == AL_EXPONENT_DISTANCE_CLAMPED);
+
+ Source->mDistanceModel = static_cast<DistanceModel>(values[0]);
if(Context->mSourceDistanceModel)
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ return UpdateSourceProps(Source, Context);
+ return true;
case AL_SOURCE_RESAMPLER_SOFT:
- CHECKVAL(*values >= 0 && *values <= ResamplerMax);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= 0 && values[0] <= ResamplerMax);
- Source->mResampler = static_cast<Resampler>(*values);
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->mResampler = static_cast<Resampler>(values[0]);
+ return UpdateSourceProps(Source, Context);
case AL_SOURCE_SPATIALIZE_SOFT:
- CHECKVAL(*values >= AL_FALSE && *values <= AL_AUTO_SOFT);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] >= AL_FALSE && values[0] <= AL_AUTO_SOFT);
- Source->mSpatialize = static_cast<SpatializeMode>(*values);
- UpdateSourceProps(Source, Context);
- return AL_TRUE;
+ Source->mSpatialize = static_cast<SpatializeMode>(values[0]);
+ return UpdateSourceProps(Source, Context);
case AL_AUXILIARY_SEND_FILTER:
+ CHECKSIZE(values, 3);
slotlock = std::unique_lock<std::mutex>{Context->mEffectSlotLock};
if(!(values[0] == 0 || (slot=LookupEffectSlot(Context, values[0])) != nullptr))
- SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid effect ID %u",
- values[0]);
+ SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid effect ID %u", values[0]);
if(static_cast<ALuint>(values[1]) >= static_cast<ALuint>(device->NumAuxSends))
- SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid send %u", values[1]);
+ SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid send %u", values[1]);
filtlock = std::unique_lock<std::mutex>{device->FilterLock};
if(!(values[2] == 0 || (filter=LookupFilter(device, values[2])) != nullptr))
- SETERR_RETURN(Context, AL_INVALID_VALUE, AL_FALSE, "Invalid filter ID %u",
- values[2]);
+ SETERR_RETURN(Context, AL_INVALID_VALUE, false, "Invalid filter ID %u", values[2]);
if(!filter)
{
@@ -1495,8 +1504,7 @@ ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
Source->Send[values[1]].Slot = slot;
UpdateSourceProps(Source, Context);
}
-
- return AL_TRUE;
+ return true;
/* 1x float */
@@ -1515,27 +1523,30 @@ ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
case AL_AIR_ABSORPTION_FACTOR:
case AL_ROOM_ROLLOFF_FACTOR:
case AL_SOURCE_RADIUS:
- fvals[0] = static_cast<ALfloat>(*values);
- return SetSourcefv(Source, Context, prop, fvals);
+ CHECKSIZE(values, 1);
+ fvals[0] = static_cast<ALfloat>(values[0]);
+ return SetSourcefv(Source, Context, prop, {fvals, 1u});
/* 3x float */
case AL_POSITION:
case AL_VELOCITY:
case AL_DIRECTION:
+ CHECKSIZE(values, 3);
fvals[0] = static_cast<ALfloat>(values[0]);
fvals[1] = static_cast<ALfloat>(values[1]);
fvals[2] = static_cast<ALfloat>(values[2]);
- return SetSourcefv(Source, Context, prop, fvals);
+ return SetSourcefv(Source, Context, prop, {fvals, 3u});
/* 6x float */
case AL_ORIENTATION:
+ CHECKSIZE(values, 6);
fvals[0] = static_cast<ALfloat>(values[0]);
fvals[1] = static_cast<ALfloat>(values[1]);
fvals[2] = static_cast<ALfloat>(values[2]);
fvals[3] = static_cast<ALfloat>(values[3]);
fvals[4] = static_cast<ALfloat>(values[4]);
fvals[5] = static_cast<ALfloat>(values[5]);
- return SetSourcefv(Source, Context, prop, fvals);
+ return SetSourcefv(Source, Context, prop, {fvals, 6u});
case AL_SAMPLE_OFFSET_LATENCY_SOFT:
case AL_SEC_OFFSET_LATENCY_SOFT:
@@ -1547,10 +1558,10 @@ ALboolean SetSourceiv(ALsource *Source, ALCcontext *Context, SourceProp prop, co
ERR("Unexpected property: 0x%04x\n", prop);
Context->setError(AL_INVALID_ENUM, "Invalid source integer property 0x%04x", prop);
- return AL_FALSE;
+ return false;
}
-ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const ALint64SOFT *values)
+bool SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop, const al::span<const ALint64SOFT> values)
{
ALfloat fvals[6];
ALint ivals[3];
@@ -1564,8 +1575,8 @@ ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop,
case AL_SAMPLE_OFFSET_LATENCY_SOFT:
case AL_SAMPLE_OFFSET_CLOCK_SOFT:
/* Query only */
- SETERR_RETURN(Context, AL_INVALID_OPERATION, AL_FALSE,
- "Setting read-only source property 0x%04x", prop);
+ SETERR_RETURN(Context, AL_INVALID_OPERATION, false,
+ "Setting read-only source property 0x%04x", prop);
/* 1x int */
case AL_SOURCE_RELATIVE:
@@ -1580,21 +1591,24 @@ ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop,
case AL_DISTANCE_MODEL:
case AL_SOURCE_RESAMPLER_SOFT:
case AL_SOURCE_SPATIALIZE_SOFT:
- CHECKVAL(*values <= INT_MAX && *values >= INT_MIN);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] <= INT_MAX && values[0] >= INT_MIN);
- ivals[0] = static_cast<ALint>(*values);
- return SetSourceiv(Source, Context, prop, ivals);
+ ivals[0] = static_cast<ALint>(values[0]);
+ return SetSourceiv(Source, Context, prop, {ivals, 1u});
/* 1x uint */
case AL_BUFFER:
case AL_DIRECT_FILTER:
- CHECKVAL(*values <= UINT_MAX && *values >= 0);
+ CHECKSIZE(values, 1);
+ CHECKVAL(values[0] <= UINT_MAX && values[0] >= 0);
- ivals[0] = static_cast<ALuint>(*values);
- return SetSourceiv(Source, Context, prop, ivals);
+ ivals[0] = static_cast<ALuint>(values[0]);
+ return SetSourceiv(Source, Context, prop, {ivals, 1u});
/* 3x uint */
case AL_AUXILIARY_SEND_FILTER:
+ CHECKSIZE(values, 3);
CHECKVAL(values[0] <= UINT_MAX && values[0] >= 0 &&
values[1] <= UINT_MAX && values[1] >= 0 &&
values[2] <= UINT_MAX && values[2] >= 0);
@@ -1602,7 +1616,7 @@ ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop,
ivals[0] = static_cast<ALuint>(values[0]);
ivals[1] = static_cast<ALuint>(values[1]);
ivals[2] = static_cast<ALuint>(values[2]);
- return SetSourceiv(Source, Context, prop, ivals);
+ return SetSourceiv(Source, Context, prop, {ivals, 3u});
/* 1x float */
case AL_CONE_INNER_ANGLE:
@@ -1620,27 +1634,30 @@ ALboolean SetSourcei64v(ALsource *Source, ALCcontext *Context, SourceProp prop,
case AL_AIR_ABSORPTION_FACTOR:
case AL_ROOM_ROLLOFF_FACTOR:
case AL_SOURCE_RADIUS:
- fvals[0] = static_cast<ALfloat>(*values);
- return SetSourcefv(Source, Context, prop, fvals);
+ CHECKSIZE(values, 1);
+ fvals[0] = static_cast<ALfloat>(values[0]);
+ return SetSourcefv(Source, Context, prop, {fvals, 1u});
/* 3x float */
case AL_POSITION:
case AL_VELOCITY:
case AL_DIRECTION:
+ CHECKSIZE(values, 3);
fvals[0] = static_cast<ALfloat>(values[0]);
fvals[1] = static_cast<ALfloat>(values[1]);
fvals[2] = static_cast<ALfloat>(values[2]);
- return SetSourcefv(Source, Context, prop, fvals);
+ return SetSourcefv(Source, Context, prop, {fvals, 3u});
/* 6x float */
case AL_ORIENTATION:
+ CHECKSIZE(values, 6);
fvals[0] = static_cast<ALfloat>(values[0]);
fvals[1] = static_cast<ALfloat>(values[1]);
fvals[2] = static_cast<ALfloat>(values[2]);
fvals[3] = static_cast<ALfloat>(values[3]);
fvals[4] = static_cast<ALfloat>(values[4]);
fvals[5] = static_cast<ALfloat>(values[5]);
- return SetSourcefv(Source, Context, prop, fvals);
+ return SetSourcefv(Source, Context, prop, {fvals, 6u});
case AL_SEC_OFFSET_LATENCY_SOFT:
case AL_SEC_OFFSET_CLOCK_SOFT:
@@ -2225,10 +2242,8 @@ START_API_FUNC
ALsource *Source = LookupSource(context.get(), source);
if(UNLIKELY(!Source))
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
- else if(FloatValsByProp(param) != 1)
- context->setError(AL_INVALID_ENUM, "Invalid float property 0x%04x", param);
else
- SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), &value);
+ SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), {&value, 1u});
}
END_API_FUNC
@@ -2243,11 +2258,9 @@ START_API_FUNC
ALsource *Source = LookupSource(context.get(), source);
if(UNLIKELY(!Source))
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
- else if(FloatValsByProp(param) != 3)
- context->setError(AL_INVALID_ENUM, "Invalid 3-float property 0x%04x", param);
else
{
- ALfloat fvals[3] = { value1, value2, value3 };
+ const ALfloat fvals[3]{ value1, value2, value3 };
SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), fvals);
}
}
@@ -2266,10 +2279,8 @@ START_API_FUNC
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
else if(!values)
context->setError(AL_INVALID_VALUE, "NULL pointer");
- else if(FloatValsByProp(param) < 1)
- context->setError(AL_INVALID_ENUM, "Invalid float-vector property 0x%04x", param);
else
- SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), values);
+ SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), {values, INT_MAX});
}
END_API_FUNC
@@ -2285,12 +2296,10 @@ START_API_FUNC
ALsource *Source = LookupSource(context.get(), source);
if(UNLIKELY(!Source))
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
- else if(DoubleValsByProp(param) != 1)
- context->setError(AL_INVALID_ENUM, "Invalid double property 0x%04x", param);
else
{
- ALfloat fval = static_cast<ALfloat>(value);
- SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), &fval);
+ const auto fval = static_cast<ALfloat>(value);
+ SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), {&fval, 1u});
}
}
END_API_FUNC
@@ -2306,12 +2315,10 @@ START_API_FUNC
ALsource *Source = LookupSource(context.get(), source);
if(UNLIKELY(!Source))
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
- else if(DoubleValsByProp(param) != 3)
- context->setError(AL_INVALID_ENUM, "Invalid 3-double property 0x%04x", param);
- else {
- ALfloat fvals[3] = {static_cast<ALfloat>(value1),
- static_cast<ALfloat>(value2),
- static_cast<ALfloat>(value3)};
+ else
+ {
+ const ALfloat fvals[3]{static_cast<ALfloat>(value1), static_cast<ALfloat>(value2),
+ static_cast<ALfloat>(value3)};
SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), fvals);
}
}
@@ -2332,17 +2339,15 @@ START_API_FUNC
context->setError(AL_INVALID_VALUE, "NULL pointer");
else
{
- ALint count{DoubleValsByProp(param)};
+ const ALuint count = DoubleValsByProp(param);
if(count < 1 || count > 6)
context->setError(AL_INVALID_ENUM, "Invalid double-vector property 0x%04x", param);
else
{
ALfloat fvals[6];
- ALint i;
-
- for(i = 0;i < count;i++)
+ for(ALuint i{0};i < count;i++)
fvals[i] = static_cast<ALfloat>(values[i]);
- SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), fvals);
+ SetSourcefv(Source, context.get(), static_cast<SourceProp>(param), {fvals, count});
}
}
}
@@ -2360,10 +2365,8 @@ START_API_FUNC
ALsource *Source = LookupSource(context.get(), source);
if(UNLIKELY(!Source))
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
- else if(IntValsByProp(param) != 1)
- context->setError(AL_INVALID_ENUM, "Invalid integer property 0x%04x", param);
else
- SetSourceiv(Source, context.get(), static_cast<SourceProp>(param), &value);
+ SetSourceiv(Source, context.get(), static_cast<SourceProp>(param), {&value, 1u});
}
END_API_FUNC
@@ -2378,11 +2381,9 @@ START_API_FUNC
ALsource *Source = LookupSource(context.get(), source);
if(UNLIKELY(!Source))
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
- else if(IntValsByProp(param) != 3)
- context->setError(AL_INVALID_ENUM, "Invalid 3-integer property 0x%04x", param);
else
{
- ALint ivals[3] = { value1, value2, value3 };
+ const ALint ivals[3]{ value1, value2, value3 };
SetSourceiv(Source, context.get(), static_cast<SourceProp>(param), ivals);
}
}
@@ -2401,10 +2402,8 @@ START_API_FUNC
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
else if(!values)
context->setError(AL_INVALID_VALUE, "NULL pointer");
- else if(IntValsByProp(param) < 1)
- context->setError(AL_INVALID_ENUM, "Invalid integer-vector property 0x%04x", param);
else
- SetSourceiv(Source, context.get(), static_cast<SourceProp>(param), values);
+ SetSourceiv(Source, context.get(), static_cast<SourceProp>(param), {values, INT_MAX});
}
END_API_FUNC
@@ -2420,10 +2419,8 @@ START_API_FUNC
ALsource *Source{LookupSource(context.get(), source)};
if(UNLIKELY(!Source))
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
- else if(Int64ValsByProp(param) != 1)
- context->setError(AL_INVALID_ENUM, "Invalid integer64 property 0x%04x", param);
else
- SetSourcei64v(Source, context.get(), static_cast<SourceProp>(param), &value);
+ SetSourcei64v(Source, context.get(), static_cast<SourceProp>(param), {&value, 1u});
}
END_API_FUNC
@@ -2438,11 +2435,9 @@ START_API_FUNC
ALsource *Source{LookupSource(context.get(), source)};
if(UNLIKELY(!Source))
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
- else if(Int64ValsByProp(param) != 3)
- context->setError(AL_INVALID_ENUM, "Invalid 3-integer64 property 0x%04x", param);
else
{
- ALint64SOFT i64vals[3] = { value1, value2, value3 };
+ const ALint64SOFT i64vals[3]{ value1, value2, value3 };
SetSourcei64v(Source, context.get(), static_cast<SourceProp>(param), i64vals);
}
}
@@ -2461,10 +2456,8 @@ START_API_FUNC
context->setError(AL_INVALID_NAME, "Invalid source ID %u", source);
else if(!values)
context->setError(AL_INVALID_VALUE, "NULL pointer");
- else if(Int64ValsByProp(param) < 1)
- context->setError(AL_INVALID_ENUM, "Invalid integer64-vector property 0x%04x", param);
else
- SetSourcei64v(Source, context.get(), static_cast<SourceProp>(param), values);
+ SetSourcei64v(Source, context.get(), static_cast<SourceProp>(param), {values, INT_MAX});
}
END_API_FUNC