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:
parent
804bf06369
commit
ac42ac336e
118
al/extension.cpp
118
al/extension.cpp
@ -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
|
||||
|
32
alc/alc.cpp
32
alc/alc.cpp
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user