Don't hide EAX functions behind a context

The standard says a function being returned doesn't necessarily mean it's
usable, and calling them will return failure if called when not usable. The
config option still prevents it from being returned, to better hide it when
disabled globally.
This commit is contained in:
Chris Robinson 2022-02-10 17:54:27 -08:00
parent 804bf06369
commit ac42ac336e
2 changed files with 28 additions and 122 deletions

View File

@ -32,10 +32,6 @@
#include "core/except.h"
#include "opthelpers.h"
#ifdef ALSOFT_EAX
#include "eax_globals.h"
#include "eax_x_ram.h"
#endif // ALSOFT_EAX
AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extName)
START_API_FUNC
@ -47,23 +43,6 @@ START_API_FUNC
SETERR_RETURN(context, AL_INVALID_VALUE, AL_FALSE, "NULL pointer");
size_t len{strlen(extName)};
#ifdef ALSOFT_EAX
if (al::strcasecmp(eax_v2_0_ext_name_1, extName) == 0 ||
al::strcasecmp(eax_v2_0_ext_name_2, extName) == 0 ||
al::strcasecmp(eax_v3_0_ext_name, extName) == 0 ||
al::strcasecmp(eax_v4_0_ext_name, extName) == 0 ||
al::strcasecmp(eax_v5_0_ext_name, extName) == 0)
{
const auto is_present = eax_g_is_enabled && context->eax_is_capable();
return is_present ? AL_TRUE : AL_FALSE;
}
if (al::strcasecmp(eax_x_ram_ext_name, extName) == 0)
{
const auto is_present = eax_g_is_enabled;
return is_present ? AL_TRUE : AL_FALSE;
}
#endif // ALSOFT_EAX
const char *ptr{context->mExtensionList};
while(ptr && *ptr)
{
@ -87,75 +66,6 @@ AL_API ALvoid* AL_APIENTRY alGetProcAddress(const ALchar *funcName)
START_API_FUNC
{
if(!funcName) return nullptr;
#ifdef ALSOFT_EAX
if (al::strcasecmp(funcName, eax_eax_set_func_name) == 0)
{
if (!eax_g_is_enabled)
{
return nullptr;
}
ContextRef context{GetContextRef()};
if (!context || !context->eax_is_capable())
{
return nullptr;
}
return reinterpret_cast<ALvoid*>(EAXSet);
}
if (al::strcasecmp(funcName, eax_eax_get_func_name) == 0)
{
if (!eax_g_is_enabled)
{
return nullptr;
}
ContextRef context{GetContextRef()};
if (!context || !context->eax_is_capable())
{
return nullptr;
}
return reinterpret_cast<ALvoid*>(EAXGet);
}
if (al::strcasecmp(funcName, eax_eax_set_buffer_mode_func_name) == 0)
{
if (!eax_g_is_enabled)
{
return nullptr;
}
ContextRef context{GetContextRef()};
if (!context)
{
return nullptr;
}
return reinterpret_cast<ALvoid*>(EAXSetBufferMode);
}
if (al::strcasecmp(funcName, eax_eax_get_buffer_mode_func_name) == 0)
{
if (!eax_g_is_enabled)
{
return nullptr;
}
ContextRef context{GetContextRef()};
if (!context)
{
return nullptr;
}
return reinterpret_cast<ALvoid*>(EAXGetBufferMode);
}
#endif // ALSOFT_EAX
return alcGetProcAddress(nullptr, funcName);
}
END_API_FUNC
@ -164,34 +74,6 @@ AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *enumName)
START_API_FUNC
{
if(!enumName) return static_cast<ALenum>(0);
#ifdef ALSOFT_EAX
if (eax_g_is_enabled)
{
struct Descriptor
{
const char* name;
ALenum value;
}; // Descriptor
constexpr Descriptor descriptors[] =
{
Descriptor{AL_EAX_RAM_SIZE_NAME, AL_EAX_RAM_SIZE},
Descriptor{AL_EAX_RAM_FREE_NAME, AL_EAX_RAM_FREE},
Descriptor{AL_STORAGE_AUTOMATIC_NAME, AL_STORAGE_AUTOMATIC},
Descriptor{AL_STORAGE_HARDWARE_NAME, AL_STORAGE_HARDWARE},
Descriptor{AL_STORAGE_ACCESSIBLE_NAME, AL_STORAGE_ACCESSIBLE},
}; // descriptors
for (const auto& descriptor : descriptors)
{
if (strcmp(descriptor.name, enumName) == 0)
{
return descriptor.value;
}
}
}
#endif // ALSOFT_EAX
return alcGetEnumValue(nullptr, enumName);
}
END_API_FUNC

View File

@ -452,6 +452,13 @@ const struct {
DECL(alAuxiliaryEffectSlotPlayvSOFT),
DECL(alAuxiliaryEffectSlotStopSOFT),
DECL(alAuxiliaryEffectSlotStopvSOFT),
#ifdef ALSOFT_EAX
}, eaxFunctions[] = {
DECL(EAXGet),
DECL(EAXSet),
DECL(EAXGetBufferMode),
DECL(EAXSetBufferMode),
#endif
};
#undef DECL
@ -882,6 +889,7 @@ constexpr struct {
DECL(AL_STOP_SOURCES_ON_DISCONNECT_SOFT),
#ifdef ALSOFT_EAX
}, eaxEnumerations[] = {
DECL(AL_EAX_RAM_SIZE),
DECL(AL_EAX_RAM_FREE),
DECL(AL_STORAGE_AUTOMATIC),
@ -2943,15 +2951,23 @@ START_API_FUNC
{
DeviceRef dev{VerifyDevice(device)};
alcSetError(dev.get(), ALC_INVALID_VALUE);
return nullptr;
}
else
#ifdef ALSOFT_EAX
if(eax_g_is_enabled)
{
for(const auto &func : alcFunctions)
for(const auto &func : eaxFunctions)
{
if(strcmp(func.funcName, funcName) == 0)
return func.address;
}
}
#endif
for(const auto &func : alcFunctions)
{
if(strcmp(func.funcName, funcName) == 0)
return func.address;
}
return nullptr;
}
END_API_FUNC
@ -2964,15 +2980,23 @@ START_API_FUNC
{
DeviceRef dev{VerifyDevice(device)};
alcSetError(dev.get(), ALC_INVALID_VALUE);
return 0;
}
else
#ifdef ALSOFT_EAX
if(eax_g_is_enabled)
{
for(const auto &enm : alcEnumerations)
for(const auto &enm : eaxEnumerations)
{
if(strcmp(enm.enumName, enumName) == 0)
return enm.value;
}
}
#endif
for(const auto &enm : alcEnumerations)
{
if(strcmp(enm.enumName, enumName) == 0)
return enm.value;
}
return 0;
}