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 "core/except.h"
#include "opthelpers.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) AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extName)
START_API_FUNC START_API_FUNC
@ -47,23 +43,6 @@ START_API_FUNC
SETERR_RETURN(context, AL_INVALID_VALUE, AL_FALSE, "NULL pointer"); SETERR_RETURN(context, AL_INVALID_VALUE, AL_FALSE, "NULL pointer");
size_t len{strlen(extName)}; 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}; const char *ptr{context->mExtensionList};
while(ptr && *ptr) while(ptr && *ptr)
{ {
@ -87,75 +66,6 @@ AL_API ALvoid* AL_APIENTRY alGetProcAddress(const ALchar *funcName)
START_API_FUNC START_API_FUNC
{ {
if(!funcName) return nullptr; 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); return alcGetProcAddress(nullptr, funcName);
} }
END_API_FUNC END_API_FUNC
@ -164,34 +74,6 @@ AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *enumName)
START_API_FUNC START_API_FUNC
{ {
if(!enumName) return static_cast<ALenum>(0); 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); return alcGetEnumValue(nullptr, enumName);
} }
END_API_FUNC END_API_FUNC

View File

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