aboutsummaryrefslogtreecommitdiffstats
path: root/al/extension.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'al/extension.cpp')
-rw-r--r--al/extension.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/al/extension.cpp b/al/extension.cpp
index 5dda2a86..373f87a9 100644
--- a/al/extension.cpp
+++ b/al/extension.cpp
@@ -32,6 +32,10 @@
#include "core/except.h"
#include "opthelpers.h"
+#if 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
@@ -43,6 +47,22 @@ START_API_FUNC
SETERR_RETURN(context, AL_INVALID_VALUE, AL_FALSE, "NULL pointer");
size_t len{strlen(extName)};
+#if ALSOFT_EAX
+ if (al::strncasecmp(eax_v2_0_ext_name, extName, len) == 0 ||
+ al::strncasecmp(eax_v3_0_ext_name, extName, len) == 0 ||
+ al::strncasecmp(eax_v4_0_ext_name, extName, len) == 0 ||
+ al::strncasecmp(eax_v5_0_ext_name, extName, len) == 0)
+ {
+ const auto is_present = eax_g_is_enabled && context->eax_is_capable();
+ return is_present ? AL_TRUE : AL_FALSE;
+ }
+
+ if (al::strncasecmp(eax_x_ram_ext_name, extName, len) == 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)
{
@@ -66,6 +86,75 @@ AL_API ALvoid* AL_APIENTRY alGetProcAddress(const ALchar *funcName)
START_API_FUNC
{
if(!funcName) return nullptr;
+#if 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
@@ -74,6 +163,34 @@ AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *enumName)
START_API_FUNC
{
if(!enumName) return static_cast<ALenum>(0);
+#if 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