diff --git a/include/Nazara/Audio/OpenAL.hpp b/include/Nazara/Audio/OpenAL.hpp index d23cd08eb..9b698ca70 100644 --- a/include/Nazara/Audio/OpenAL.hpp +++ b/include/Nazara/Audio/OpenAL.hpp @@ -7,168 +7,16 @@ #ifndef NAZARA_AUDIO_OPENAL_HPP #define NAZARA_AUDIO_OPENAL_HPP -// no include reordering - #if defined(NAZARA_AUDIO_OPENAL) || defined(NAZARA_AUDIO_BUILD) -#include - // Inclusion of OpenAL headers +#include +#include -// OpenAL headers does not allow us to only get the signatures without the pointers to the functions -// And I do no want to modify them, I'm obliged to put them in a different namespace -// to put only interesting things back in the global namespace (specially typedef) -namespace OpenALDetail -{ - #include - #include - #include -} - -// If someone has a better idea ... -using OpenALDetail::ALboolean; -using OpenALDetail::ALbyte; -using OpenALDetail::ALchar; -using OpenALDetail::ALdouble; -using OpenALDetail::ALenum; -using OpenALDetail::ALfloat; -using OpenALDetail::ALint; -using OpenALDetail::ALshort; -using OpenALDetail::ALsizei; -using OpenALDetail::ALubyte; -using OpenALDetail::ALuint; -using OpenALDetail::ALushort; -using OpenALDetail::ALvoid; - -// SOFT_source_latency -using OpenALDetail::ALint64SOFT; -using OpenALDetail::ALuint64SOFT; - -using OpenALDetail::ALCboolean; -using OpenALDetail::ALCbyte; -using OpenALDetail::ALCchar; -using OpenALDetail::ALCcontext; -using OpenALDetail::ALCdevice; -using OpenALDetail::ALCdouble; -using OpenALDetail::ALCenum; -using OpenALDetail::ALCfloat; -using OpenALDetail::ALCint; -using OpenALDetail::ALCshort; -using OpenALDetail::ALCsizei; -using OpenALDetail::ALCubyte; -using OpenALDetail::ALCuint; -using OpenALDetail::ALCushort; -using OpenALDetail::ALCvoid; - -#define NAZARA_AUDIO_FOREACH_AL_FUNC(cb, extCb) \ - cb(alBuffer3f, OpenALDetail::LPALBUFFER3F) \ - cb(alBuffer3i, OpenALDetail::LPALBUFFER3I) \ - cb(alBufferData, OpenALDetail::LPALBUFFERDATA) \ - cb(alBufferf, OpenALDetail::LPALBUFFERF) \ - cb(alBufferfv, OpenALDetail::LPALBUFFERFV) \ - cb(alBufferi, OpenALDetail::LPALBUFFERI) \ - cb(alBufferiv, OpenALDetail::LPALBUFFERIV) \ - cb(alDeleteBuffers, OpenALDetail::LPALDELETEBUFFERS) \ - cb(alDeleteSources, OpenALDetail::LPALDELETESOURCES) \ - cb(alDisable, OpenALDetail::LPALDISABLE) \ - cb(alDistanceModel, OpenALDetail::LPALDISTANCEMODEL) \ - cb(alDopplerFactor, OpenALDetail::LPALDOPPLERFACTOR) \ - cb(alDopplerVelocity, OpenALDetail::LPALDOPPLERVELOCITY) \ - cb(alEnable, OpenALDetail::LPALENABLE) \ - cb(alGenBuffers, OpenALDetail::LPALGENBUFFERS) \ - cb(alGenSources, OpenALDetail::LPALGENSOURCES) \ - cb(alGetBoolean, OpenALDetail::LPALGETBOOLEAN) \ - cb(alGetBooleanv, OpenALDetail::LPALGETBOOLEANV) \ - cb(alGetBuffer3f, OpenALDetail::LPALGETBUFFER3F) \ - cb(alGetBuffer3i, OpenALDetail::LPALGETBUFFER3I) \ - cb(alGetBufferf, OpenALDetail::LPALGETBUFFERF) \ - cb(alGetBufferfv, OpenALDetail::LPALGETBUFFERFV) \ - cb(alGetBufferi, OpenALDetail::LPALGETBUFFERI) \ - cb(alGetBufferiv, OpenALDetail::LPALGETBUFFERIV) \ - cb(alGetDouble, OpenALDetail::LPALGETDOUBLE) \ - cb(alGetDoublev, OpenALDetail::LPALGETDOUBLEV) \ - cb(alGetEnumValue, OpenALDetail::LPALGETENUMVALUE) \ - cb(alGetError, OpenALDetail::LPALGETERROR) \ - cb(alGetFloat, OpenALDetail::LPALGETFLOAT) \ - cb(alGetFloatv, OpenALDetail::LPALGETFLOATV) \ - cb(alGetInteger, OpenALDetail::LPALGETINTEGER) \ - cb(alGetIntegerv, OpenALDetail::LPALGETINTEGERV) \ - cb(alGetListener3f, OpenALDetail::LPALGETLISTENER3F) \ - cb(alGetListener3i, OpenALDetail::LPALGETLISTENER3I) \ - cb(alGetListenerf, OpenALDetail::LPALGETLISTENERF) \ - cb(alGetListenerfv, OpenALDetail::LPALGETLISTENERFV) \ - cb(alGetListeneri, OpenALDetail::LPALGETLISTENERI) \ - cb(alGetListeneriv, OpenALDetail::LPALGETLISTENERIV) \ - cb(alGetProcAddress, OpenALDetail::LPALGETPROCADDRESS) \ - cb(alGetSource3f, OpenALDetail::LPALGETSOURCE3F) \ - cb(alGetSource3i, OpenALDetail::LPALGETSOURCE3I) \ - cb(alGetSourcef, OpenALDetail::LPALGETSOURCEF) \ - cb(alGetSourcefv, OpenALDetail::LPALGETSOURCEFV) \ - cb(alGetSourcei, OpenALDetail::LPALGETSOURCEI) \ - cb(alGetSourceiv, OpenALDetail::LPALGETSOURCEIV) \ - cb(alGetString, OpenALDetail::LPALGETSTRING) \ - cb(alIsBuffer, OpenALDetail::LPALISBUFFER) \ - cb(alIsEnabled, OpenALDetail::LPALISENABLED) \ - cb(alIsExtensionPresent, OpenALDetail::LPALISEXTENSIONPRESENT) \ - cb(alIsSource, OpenALDetail::LPALISSOURCE) \ - cb(alListener3f, OpenALDetail::LPALLISTENER3F) \ - cb(alListener3i, OpenALDetail::LPALLISTENER3I) \ - cb(alListenerf, OpenALDetail::LPALLISTENERF) \ - cb(alListenerfv, OpenALDetail::LPALLISTENERFV) \ - cb(alListeneri, OpenALDetail::LPALLISTENERI) \ - cb(alListeneriv, OpenALDetail::LPALLISTENERIV) \ - cb(alSource3f, OpenALDetail::LPALSOURCE3F) \ - cb(alSource3i, OpenALDetail::LPALSOURCE3I) \ - cb(alSourcef, OpenALDetail::LPALSOURCEF) \ - cb(alSourcefv, OpenALDetail::LPALSOURCEFV) \ - cb(alSourcei, OpenALDetail::LPALSOURCEI) \ - cb(alSourceiv, OpenALDetail::LPALSOURCEIV) \ - cb(alSourcePause, OpenALDetail::LPALSOURCEPAUSE) \ - cb(alSourcePausev, OpenALDetail::LPALSOURCEPAUSEV) \ - cb(alSourcePlay, OpenALDetail::LPALSOURCEPLAY) \ - cb(alSourcePlayv, OpenALDetail::LPALSOURCEPLAYV) \ - cb(alSourceQueueBuffers, OpenALDetail::LPALSOURCEQUEUEBUFFERS) \ - cb(alSourceRewind, OpenALDetail::LPALSOURCEREWIND) \ - cb(alSourceRewindv, OpenALDetail::LPALSOURCEREWINDV) \ - cb(alSourceStop, OpenALDetail::LPALSOURCESTOP) \ - cb(alSourceStopv, OpenALDetail::LPALSOURCESTOPV) \ - cb(alSourceUnqueueBuffers, OpenALDetail::LPALSOURCEUNQUEUEBUFFERS) \ - cb(alSpeedOfSound, OpenALDetail::LPALSPEEDOFSOUND) \ - /* AL_SOFT_source_latency */ \ - extCb(alGetSource3dSOFT, OpenALDetail::LPALGETSOURCE3DSOFT) \ - extCb(alGetSource3i64SOFT, OpenALDetail::LPALGETSOURCE3I64SOFT) \ - extCb(alGetSourcedSOFT, OpenALDetail::LPALGETSOURCEDSOFT) \ - extCb(alGetSourcedvSOFT, OpenALDetail::LPALGETSOURCEDVSOFT) \ - extCb(alGetSourcei64SOFT, OpenALDetail::LPALGETSOURCEI64SOFT) \ - extCb(alGetSourcei64vSOFT, OpenALDetail::LPALGETSOURCEI64VSOFT) \ - extCb(alSource3dSOFT, OpenALDetail::LPALSOURCE3DSOFT) \ - extCb(alSource3i64SOFT, OpenALDetail::LPALSOURCE3I64SOFT) \ - extCb(alSourcedSOFT, OpenALDetail::LPALSOURCEDSOFT) \ - extCb(alSourcedvSOFT, OpenALDetail::LPALSOURCEDVSOFT) \ - extCb(alSourcei64SOFT, OpenALDetail::LPALSOURCEI64SOFT) \ - extCb(alSourcei64vSOFT, OpenALDetail::LPALSOURCEI64VSOFT) \ - -#define NAZARA_AUDIO_FOREACH_ALC_FUNC(cb, extCb) \ - cb(alcCaptureCloseDevice, OpenALDetail::LPALCCAPTURECLOSEDEVICE) \ - cb(alcCaptureOpenDevice, OpenALDetail::LPALCCAPTUREOPENDEVICE) \ - cb(alcCaptureSamples, OpenALDetail::LPALCCAPTURESAMPLES) \ - cb(alcCaptureStart, OpenALDetail::LPALCCAPTURESTART) \ - cb(alcCaptureStop, OpenALDetail::LPALCCAPTURESTOP) \ - cb(alcCloseDevice, OpenALDetail::LPALCCLOSEDEVICE) \ - cb(alcCreateContext, OpenALDetail::LPALCCREATECONTEXT) \ - cb(alcDestroyContext, OpenALDetail::LPALCDESTROYCONTEXT) \ - cb(alcGetContextsDevice, OpenALDetail::LPALCGETCONTEXTSDEVICE) \ - cb(alcGetCurrentContext, OpenALDetail::LPALCGETCURRENTCONTEXT) \ - cb(alcGetEnumValue, OpenALDetail::LPALCGETENUMVALUE) \ - cb(alcGetError, OpenALDetail::LPALCGETERROR) \ - cb(alcGetIntegerv, OpenALDetail::LPALCGETINTEGERV) \ - cb(alcGetProcAddress, OpenALDetail::LPALCGETPROCADDRESS) \ - cb(alcGetString, OpenALDetail::LPALCGETSTRING) \ - cb(alcIsExtensionPresent, OpenALDetail::LPALCISEXTENSIONPRESENT) \ - cb(alcMakeContextCurrent, OpenALDetail::LPALCMAKECONTEXTCURRENT) \ - cb(alcOpenDevice, OpenALDetail::LPALCOPENDEVICE) \ - cb(alcProcessContext, OpenALDetail::LPALCPROCESSCONTEXT) \ - cb(alcSuspendContext, OpenALDetail::LPALCSUSPENDCONTEXT) \ +#ifndef NAZARA_PLATFORM_WEB +// Emscripten ships its own set of OpenAL headers which does not include alext.h +#include +#endif #endif // NAZARA_AUDIO_OPENAL diff --git a/include/Nazara/Audio/OpenALFunctions.hpp b/include/Nazara/Audio/OpenALFunctions.hpp new file mode 100644 index 000000000..f50c8bd1a --- /dev/null +++ b/include/Nazara/Audio/OpenALFunctions.hpp @@ -0,0 +1,148 @@ +// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Audio module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +// no header guards + +#if (!defined(NAZARA_AUDIO_AL_FUNCTION) || !defined(NAZARA_AUDIO_ALC_FUNCTION)) && !defined(NAZARA_AUDIO_AL_ALC_FUNCTION) +#error You must define NAZARA_AUDIO_AL_FUNCTION and NAZARA_AUDIO_ALC_FUNCTION, or NAZARA_AUDIO_AL_ALC_FUNCTION before including this file +#endif + +#ifndef NAZARA_AUDIO_AL_FUNCTION +#define NAZARA_AUDIO_AL_FUNCTION(func) NAZARA_AUDIO_AL_ALC_FUNCTION(func) +#endif + +#ifndef NAZARA_AUDIO_ALC_FUNCTION +#define NAZARA_AUDIO_ALC_FUNCTION(func) NAZARA_AUDIO_AL_ALC_FUNCTION(func) +#endif + +#ifndef NAZARA_AUDIO_AL_EXT_FUNCTION +#define NAZARA_AUDIO_AL_EXT_FUNCTION(func) NAZARA_AUDIO_AL_FUNCTION(func) +#endif + +#ifndef NAZARA_AUDIO_AL_EXT_BEGIN +#define NAZARA_AUDIO_AL_EXT_BEGIN(ext) +#endif + +#ifndef NAZARA_AUDIO_AL_EXT_END +#define NAZARA_AUDIO_AL_EXT_END() +#endif + +NAZARA_AUDIO_AL_FUNCTION(alBuffer3f) +NAZARA_AUDIO_AL_FUNCTION(alBuffer3i) +NAZARA_AUDIO_AL_FUNCTION(alBufferData) +NAZARA_AUDIO_AL_FUNCTION(alBufferf) +NAZARA_AUDIO_AL_FUNCTION(alBufferfv) +NAZARA_AUDIO_AL_FUNCTION(alBufferi) +NAZARA_AUDIO_AL_FUNCTION(alBufferiv) +NAZARA_AUDIO_AL_FUNCTION(alDeleteBuffers) +NAZARA_AUDIO_AL_FUNCTION(alDeleteSources) +NAZARA_AUDIO_AL_FUNCTION(alDisable) +NAZARA_AUDIO_AL_FUNCTION(alDistanceModel) +NAZARA_AUDIO_AL_FUNCTION(alDopplerFactor) +NAZARA_AUDIO_AL_FUNCTION(alDopplerVelocity) +NAZARA_AUDIO_AL_FUNCTION(alEnable) +NAZARA_AUDIO_AL_FUNCTION(alGenBuffers) +NAZARA_AUDIO_AL_FUNCTION(alGenSources) +NAZARA_AUDIO_AL_FUNCTION(alGetBoolean) +NAZARA_AUDIO_AL_FUNCTION(alGetBooleanv) +NAZARA_AUDIO_AL_FUNCTION(alGetBuffer3f) +NAZARA_AUDIO_AL_FUNCTION(alGetBuffer3i) +NAZARA_AUDIO_AL_FUNCTION(alGetBufferf) +NAZARA_AUDIO_AL_FUNCTION(alGetBufferfv) +NAZARA_AUDIO_AL_FUNCTION(alGetBufferi) +NAZARA_AUDIO_AL_FUNCTION(alGetBufferiv) +NAZARA_AUDIO_AL_FUNCTION(alGetDouble) +NAZARA_AUDIO_AL_FUNCTION(alGetDoublev) +NAZARA_AUDIO_AL_FUNCTION(alGetEnumValue) +NAZARA_AUDIO_AL_FUNCTION(alGetError) +NAZARA_AUDIO_AL_FUNCTION(alGetFloat) +NAZARA_AUDIO_AL_FUNCTION(alGetFloatv) +NAZARA_AUDIO_AL_FUNCTION(alGetInteger) +NAZARA_AUDIO_AL_FUNCTION(alGetIntegerv) +NAZARA_AUDIO_AL_FUNCTION(alGetListener3f) +NAZARA_AUDIO_AL_FUNCTION(alGetListener3i) +NAZARA_AUDIO_AL_FUNCTION(alGetListenerf) +NAZARA_AUDIO_AL_FUNCTION(alGetListenerfv) +NAZARA_AUDIO_AL_FUNCTION(alGetListeneri) +NAZARA_AUDIO_AL_FUNCTION(alGetListeneriv) +NAZARA_AUDIO_AL_FUNCTION(alGetProcAddress) +NAZARA_AUDIO_AL_FUNCTION(alGetSource3f) +NAZARA_AUDIO_AL_FUNCTION(alGetSource3i) +NAZARA_AUDIO_AL_FUNCTION(alGetSourcef) +NAZARA_AUDIO_AL_FUNCTION(alGetSourcefv) +NAZARA_AUDIO_AL_FUNCTION(alGetSourcei) +NAZARA_AUDIO_AL_FUNCTION(alGetSourceiv) +NAZARA_AUDIO_AL_FUNCTION(alGetString) +NAZARA_AUDIO_AL_FUNCTION(alIsBuffer) +NAZARA_AUDIO_AL_FUNCTION(alIsEnabled) +NAZARA_AUDIO_AL_FUNCTION(alIsExtensionPresent) +NAZARA_AUDIO_AL_FUNCTION(alIsSource) +NAZARA_AUDIO_AL_FUNCTION(alListener3f) +NAZARA_AUDIO_AL_FUNCTION(alListener3i) +NAZARA_AUDIO_AL_FUNCTION(alListenerf) +NAZARA_AUDIO_AL_FUNCTION(alListenerfv) +NAZARA_AUDIO_AL_FUNCTION(alListeneri) +NAZARA_AUDIO_AL_FUNCTION(alListeneriv) +NAZARA_AUDIO_AL_FUNCTION(alSource3f) +NAZARA_AUDIO_AL_FUNCTION(alSource3i) +NAZARA_AUDIO_AL_FUNCTION(alSourcef) +NAZARA_AUDIO_AL_FUNCTION(alSourcefv) +NAZARA_AUDIO_AL_FUNCTION(alSourcei) +NAZARA_AUDIO_AL_FUNCTION(alSourceiv) +NAZARA_AUDIO_AL_FUNCTION(alSourcePause) +NAZARA_AUDIO_AL_FUNCTION(alSourcePausev) +NAZARA_AUDIO_AL_FUNCTION(alSourcePlay) +NAZARA_AUDIO_AL_FUNCTION(alSourcePlayv) +NAZARA_AUDIO_AL_FUNCTION(alSourceQueueBuffers) +NAZARA_AUDIO_AL_FUNCTION(alSourceRewind) +NAZARA_AUDIO_AL_FUNCTION(alSourceRewindv) +NAZARA_AUDIO_AL_FUNCTION(alSourceStop) +NAZARA_AUDIO_AL_FUNCTION(alSourceStopv) +NAZARA_AUDIO_AL_FUNCTION(alSourceUnqueueBuffers) +NAZARA_AUDIO_AL_FUNCTION(alSpeedOfSound) + +/* +NAZARA_AUDIO_AL_EXT_BEGIN(AL_SOFT_source_latency) +NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSource3dSOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSource3i64SOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSourcedSOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSourcedvSOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSourcei64SOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSourcei64vSOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alSource3dSOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alSource3i64SOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alSourcedSOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alSourcedvSOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alSourcei64SOFT) +NAZARA_AUDIO_AL_FUNCTION_EXT(alSourcei64vSOFT) +NAZARA_AUDIO_AL_EXT_END() +*/ + +NAZARA_AUDIO_ALC_FUNCTION(alcCaptureCloseDevice) +NAZARA_AUDIO_ALC_FUNCTION(alcCaptureOpenDevice) +NAZARA_AUDIO_ALC_FUNCTION(alcCaptureSamples) +NAZARA_AUDIO_ALC_FUNCTION(alcCaptureStart) +NAZARA_AUDIO_ALC_FUNCTION(alcCaptureStop) +NAZARA_AUDIO_ALC_FUNCTION(alcCloseDevice) +NAZARA_AUDIO_ALC_FUNCTION(alcCreateContext) +NAZARA_AUDIO_ALC_FUNCTION(alcDestroyContext) +NAZARA_AUDIO_ALC_FUNCTION(alcGetContextsDevice) +NAZARA_AUDIO_ALC_FUNCTION(alcGetCurrentContext) +NAZARA_AUDIO_ALC_FUNCTION(alcGetEnumValue) +NAZARA_AUDIO_ALC_FUNCTION(alcGetError) +NAZARA_AUDIO_ALC_FUNCTION(alcGetIntegerv) +NAZARA_AUDIO_ALC_FUNCTION(alcGetProcAddress) +NAZARA_AUDIO_ALC_FUNCTION(alcGetString) +NAZARA_AUDIO_ALC_FUNCTION(alcIsExtensionPresent) +NAZARA_AUDIO_ALC_FUNCTION(alcMakeContextCurrent) +NAZARA_AUDIO_ALC_FUNCTION(alcOpenDevice) +NAZARA_AUDIO_ALC_FUNCTION(alcProcessContext) +NAZARA_AUDIO_ALC_FUNCTION(alcSuspendContext) + +#undef NAZARA_AUDIO_AL_FUNCTION +#undef NAZARA_AUDIO_AL_ALC_FUNCTION +#undef NAZARA_AUDIO_AL_EXT_FUNCTION +#undef NAZARA_AUDIO_ALC_FUNCTION +#undef NAZARA_AUDIO_AL_EXT_BEGIN +#undef NAZARA_AUDIO_AL_EXT_END diff --git a/include/Nazara/Audio/OpenALLibrary.hpp b/include/Nazara/Audio/OpenALLibrary.hpp index c9a1d1c66..6d710bddb 100644 --- a/include/Nazara/Audio/OpenALLibrary.hpp +++ b/include/Nazara/Audio/OpenALLibrary.hpp @@ -13,17 +13,18 @@ #include #include #include -#include #include #include #include namespace Nz { + class OpenALDevice; + class NAZARA_AUDIO_API OpenALLibrary { public: - OpenALLibrary() = default; + inline OpenALLibrary(); OpenALLibrary(const OpenALLibrary&) = delete; OpenALLibrary(OpenALLibrary&&) = delete; inline ~OpenALLibrary(); @@ -42,15 +43,14 @@ namespace Nz OpenALLibrary& operator=(const OpenALLibrary&) = delete; OpenALLibrary& operator=(OpenALLibrary&&) = delete; -#define NAZARA_AUDIO_FUNC(name, sig) sig name; - NAZARA_AUDIO_FOREACH_AL_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC) - NAZARA_AUDIO_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC) -#undef NAZARA_AUDIO_FUNC +#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) decltype(&::name) name; +#include private: std::vector ParseDevices(const char* deviceString); DynLib m_library; + bool m_isLoaded; bool m_hasCaptureSupport; }; } diff --git a/include/Nazara/Audio/OpenALLibrary.inl b/include/Nazara/Audio/OpenALLibrary.inl index 05e08e4e0..856fd9a2d 100644 --- a/include/Nazara/Audio/OpenALLibrary.inl +++ b/include/Nazara/Audio/OpenALLibrary.inl @@ -7,6 +7,12 @@ namespace Nz { + inline OpenALLibrary::OpenALLibrary() : + m_hasCaptureSupport(false), + m_isLoaded(false) + { + } + inline OpenALLibrary::~OpenALLibrary() { Unload(); @@ -14,7 +20,7 @@ namespace Nz inline bool OpenALLibrary::IsLoaded() const { - return m_library.IsLoaded(); + return m_isLoaded; } } diff --git a/include/Nazara/Utility.hpp b/include/Nazara/Utility.hpp index 54b2fa2b5..34b2ea189 100644 --- a/include/Nazara/Utility.hpp +++ b/include/Nazara/Utility.hpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Nazara/Audio/Audio.cpp b/src/Nazara/Audio/Audio.cpp index 153c9f585..02f8a6c86 100644 --- a/src/Nazara/Audio/Audio.cpp +++ b/src/Nazara/Audio/Audio.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/Nazara/Audio/OpenALLibrary.cpp b/src/Nazara/Audio/OpenALLibrary.cpp index e9380a68e..cb098f2f5 100644 --- a/src/Nazara/Audio/OpenALLibrary.cpp +++ b/src/Nazara/Audio/OpenALLibrary.cpp @@ -3,6 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #include #include #include @@ -23,6 +24,16 @@ namespace Nz CallOnExit unloadOnFailure([this] { Unload(); }); + auto PostLoad = [&] + { + m_hasCaptureSupport = alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE"); + m_isLoaded = true; + + unloadOnFailure.Reset(); + }; + +#ifndef NAZARA_AUDIO_OPENAL_LINK + // Dynamically load OpenAL #if defined(NAZARA_PLATFORM_WINDOWS) std::array libs{ "soft_oal.dll", @@ -74,15 +85,32 @@ namespace Nz continue; } - m_hasCaptureSupport = alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE"); - - unloadOnFailure.Reset(); + PostLoad(); return true; } NazaraError("failed to load OpenAL library"); return false; - } + +#else + // OpenAL is linked to the executable + + // Load core +#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = &::name; +#define NAZARA_AUDIO_AL_EXT_FUNCTION(name) +#include + + // Load ext +#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) +#define NAZARA_AUDIO_AL_EXT_BEGIN(ext) if (alIsExtensionPresent(#ext)) { +#define NAZARA_AUDIO_AL_EXT_END() } +#define NAZARA_AUDIO_AL_FUNCTION_EXT(name) name = reinterpret_cast(alGetProcAddress(#name)); +#include + + PostLoad(); + return true; +#endif + } std::vector OpenALLibrary::QueryInputDevices() { @@ -111,10 +139,8 @@ namespace Nz if (!m_library.IsLoaded()) return; -#define NAZARA_AUDIO_FUNC(name, sig) name = nullptr; - NAZARA_AUDIO_FOREACH_AL_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC) - NAZARA_AUDIO_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC) -#undef NAZARA_AUDIO_FUNC +#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = nullptr; +#include m_library.Unload(); } diff --git a/src/Nazara/Audio/OpenALSource.cpp b/src/Nazara/Audio/OpenALSource.cpp index d4bf7a808..a40b25903 100644 --- a/src/Nazara/Audio/OpenALSource.cpp +++ b/src/Nazara/Audio/OpenALSource.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -84,6 +85,7 @@ namespace Nz auto OpenALSource::GetSampleOffsetAndLatency() const -> OffsetWithLatency { OffsetWithLatency offsetWithLatency; +#ifdef AL_SOFT_source_latency if (GetDevice().IsExtensionSupported(OpenALExtension::SourceLatency)) { GetDevice().MakeContextCurrent(); @@ -96,6 +98,7 @@ namespace Nz } else +#endif { offsetWithLatency.sampleOffset = GetSampleOffset() * 1'000; offsetWithLatency.sourceLatency = 0; diff --git a/xmake.lua b/xmake.lua index 4e851a97b..6968c1455 100644 --- a/xmake.lua +++ b/xmake.lua @@ -43,7 +43,17 @@ local modules = { Deps = {"NazaraCore"}, Packages = {"dr_wav", "frozen", "libflac", "libvorbis", "minimp3"}, Custom = function () - add_packages("openal-soft", { links = {} }) -- Don't link OpenAL (it will be loaded dynamically) + if is_plat("wasm") or has_config("link_openal") then + add_defines("NAZARA_AUDIO_OPENAL_LINK") + if is_plat("wasm") then + add_syslinks("openal") + else + add_defines("AL_ALEXT_PROTOTYPES") + add_packages("openal-soft") + end + else + add_packages("openal-soft", { links = {} }) + end end }, Core = { @@ -143,6 +153,7 @@ includes("xmake/**.lua") option("compile_shaders", { description = "Compile nzsl shaders into an includable binary version", default = true }) option("embed_rendererbackends", { description = "Embed renderer backend code into NazaraRenderer instead of loading them dynamically", default = false }) option("embed_resources", { description = "Turn builtin resources into includable headers", default = true }) +option("link_openal", { description = "Link OpenAL in the executable instead of dynamically loading it", default = false }) option("override_runtime", { description = "Override vs runtime to MD in release and MDd in debug", default = true }) option("usepch", { description = "Use precompiled headers to speedup compilation", default = false }) option("unitybuild", { description = "Build the engine using unity build", default = false })