aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--al/effect.cpp96
-rw-r--r--alc/effects/base.h14
2 files changed, 71 insertions, 39 deletions
diff --git a/al/effect.cpp b/al/effect.cpp
index 6ea1be39..e4ad75ab 100644
--- a/al/effect.cpp
+++ b/al/effect.cpp
@@ -312,33 +312,33 @@ START_API_FUNC
ALeffect *aleffect{LookupEffect(device, effect)};
if UNLIKELY(!aleffect)
context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect);
- else
+ else if(param == AL_EFFECT_TYPE)
{
- if(param == AL_EFFECT_TYPE)
+ bool isOk{value == AL_EFFECT_NULL};
+ if(!isOk)
{
- bool isOk{value == AL_EFFECT_NULL};
- if(!isOk)
+ for(const EffectList &effectitem : gEffectList)
{
- for(const EffectList &effectitem : gEffectList)
+ if(value == effectitem.val && !DisabledEffects[effectitem.type])
{
- if(value == effectitem.val && !DisabledEffects[effectitem.type])
- {
- isOk = true;
- break;
- }
+ isOk = true;
+ break;
}
}
-
- if(isOk)
- InitEffectParams(aleffect, value);
- else
- context->setError(AL_INVALID_VALUE, "Effect type 0x%04x not supported", value);
}
+
+ if(isOk)
+ InitEffectParams(aleffect, value);
else
- {
- /* Call the appropriate handler */
- ALeffect_setParami(aleffect, context.get(), param, value);
- }
+ context->setError(AL_INVALID_VALUE, "Effect type 0x%04x not supported", value);
+ }
+ else try
+ {
+ /* Call the appropriate handler */
+ ALeffect_setParami(aleffect, context.get(), param, value);
+ }
+ catch(effect_exception &e) {
+ context->setError(e.errorCode(), "%s", e.what());
}
}
END_API_FUNC
@@ -348,9 +348,9 @@ START_API_FUNC
{
switch(param)
{
- case AL_EFFECT_TYPE:
- alEffecti(effect, param, values[0]);
- return;
+ case AL_EFFECT_TYPE:
+ alEffecti(effect, param, values[0]);
+ return;
}
ContextRef context{GetContextRef()};
@@ -362,11 +362,14 @@ START_API_FUNC
ALeffect *aleffect{LookupEffect(device, effect)};
if UNLIKELY(!aleffect)
context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect);
- else
+ else try
{
/* Call the appropriate handler */
ALeffect_setParamiv(aleffect, context.get(), param, values);
}
+ catch(effect_exception &e) {
+ context->setError(e.errorCode(), "%s", e.what());
+ }
}
END_API_FUNC
@@ -382,11 +385,14 @@ START_API_FUNC
ALeffect *aleffect{LookupEffect(device, effect)};
if UNLIKELY(!aleffect)
context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect);
- else
+ else try
{
/* Call the appropriate handler */
ALeffect_setParamf(aleffect, context.get(), param, value);
}
+ catch(effect_exception &e) {
+ context->setError(e.errorCode(), "%s", e.what());
+ }
}
END_API_FUNC
@@ -402,11 +408,14 @@ START_API_FUNC
ALeffect *aleffect{LookupEffect(device, effect)};
if UNLIKELY(!aleffect)
context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect);
- else
+ else try
{
/* Call the appropriate handler */
ALeffect_setParamfv(aleffect, context.get(), param, values);
}
+ catch(effect_exception &e) {
+ context->setError(e.errorCode(), "%s", e.what());
+ }
}
END_API_FUNC
@@ -422,15 +431,15 @@ START_API_FUNC
const ALeffect *aleffect{LookupEffect(device, effect)};
if UNLIKELY(!aleffect)
context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect);
- else
+ else if(param == AL_EFFECT_TYPE)
+ *value = aleffect->type;
+ else try
{
- if(param == AL_EFFECT_TYPE)
- *value = aleffect->type;
- else
- {
- /* Call the appropriate handler */
- ALeffect_getParami(aleffect, context.get(), param, value);
- }
+ /* Call the appropriate handler */
+ ALeffect_getParami(aleffect, context.get(), param, value);
+ }
+ catch(effect_exception &e) {
+ context->setError(e.errorCode(), "%s", e.what());
}
}
END_API_FUNC
@@ -440,9 +449,9 @@ START_API_FUNC
{
switch(param)
{
- case AL_EFFECT_TYPE:
- alGetEffecti(effect, param, values);
- return;
+ case AL_EFFECT_TYPE:
+ alGetEffecti(effect, param, values);
+ return;
}
ContextRef context{GetContextRef()};
@@ -454,11 +463,14 @@ START_API_FUNC
const ALeffect *aleffect{LookupEffect(device, effect)};
if UNLIKELY(!aleffect)
context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect);
- else
+ else try
{
/* Call the appropriate handler */
ALeffect_getParamiv(aleffect, context.get(), param, values);
}
+ catch(effect_exception &e) {
+ context->setError(e.errorCode(), "%s", e.what());
+ }
}
END_API_FUNC
@@ -474,11 +486,14 @@ START_API_FUNC
const ALeffect *aleffect{LookupEffect(device, effect)};
if UNLIKELY(!aleffect)
context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect);
- else
+ else try
{
/* Call the appropriate handler */
ALeffect_getParamf(aleffect, context.get(), param, value);
}
+ catch(effect_exception &e) {
+ context->setError(e.errorCode(), "%s", e.what());
+ }
}
END_API_FUNC
@@ -494,11 +509,14 @@ START_API_FUNC
const ALeffect *aleffect{LookupEffect(device, effect)};
if UNLIKELY(!aleffect)
context->setError(AL_INVALID_NAME, "Invalid effect ID %u", effect);
- else
+ else try
{
/* Call the appropriate handler */
ALeffect_getParamfv(aleffect, context.get(), param, values);
}
+ catch(effect_exception &e) {
+ context->setError(e.errorCode(), "%s", e.what());
+ }
}
END_API_FUNC
diff --git a/alc/effects/base.h b/alc/effects/base.h
index 5d77e904..76ead78f 100644
--- a/alc/effects/base.h
+++ b/alc/effects/base.h
@@ -4,6 +4,7 @@
#include <cstddef>
#include "alcmain.h"
+#include "alexcpt.h"
#include "almalloc.h"
#include "alspan.h"
#include "atomic.h"
@@ -125,6 +126,19 @@ union EffectProps {
};
+class effect_exception final : public al::base_exception {
+public:
+ [[gnu::format(printf, 3, 4)]]
+ effect_exception(ALenum code, const char *msg, ...) : base_exception{code}
+ {
+ va_list args;
+ va_start(args, msg);
+ setMessage(msg, args);
+ va_end(args);
+ }
+};
+
+
struct EffectVtable {
void (*const setParami)(EffectProps *props, ALCcontext *context, ALenum param, int val);
void (*const setParamiv)(EffectProps *props, ALCcontext *context, ALenum param, const int *vals);