Audio: Add an option to directly link OpenAL

This commit is contained in:
SirLynix 2022-12-06 07:48:03 +01:00
parent 98cf8b3d33
commit 2dd0e7d9c8
9 changed files with 218 additions and 175 deletions

View File

@ -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 <cstddef>
// Inclusion of OpenAL headers
// 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 <AL/al.h>
#include <AL/alc.h>
#ifndef NAZARA_PLATFORM_WEB
// Emscripten ships its own set of OpenAL headers which does not include alext.h
#include <AL/alext.h>
}
// 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) \
#endif
#endif // NAZARA_AUDIO_OPENAL

View File

@ -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

View File

@ -13,17 +13,18 @@
#include <Nazara/Audio/Config.hpp>
#include <Nazara/Audio/Enums.hpp>
#include <Nazara/Audio/OpenAL.hpp>
#include <Nazara/Audio/OpenALDevice.hpp>
#include <Nazara/Core/DynLib.hpp>
#include <string>
#include <vector>
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 <Nazara/Audio/OpenALFunctions.hpp>
private:
std::vector<std::string> ParseDevices(const char* deviceString);
DynLib m_library;
bool m_isLoaded;
bool m_hasCaptureSupport;
};
}

View File

@ -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;
}
}

View File

@ -34,6 +34,7 @@
#include <Nazara/Utility/AbstractTextDrawer.hpp>
#include <Nazara/Utility/Algorithm.hpp>
#include <Nazara/Utility/Animation.hpp>
#include <Nazara/Utility/BasicMainloop.hpp>
#include <Nazara/Utility/Buffer.hpp>
#include <Nazara/Utility/BufferMapper.hpp>
#include <Nazara/Utility/Config.hpp>

View File

@ -8,7 +8,7 @@
#include <Nazara/Audio/Config.hpp>
#include <Nazara/Audio/DummyAudioDevice.hpp>
#include <Nazara/Audio/Enums.hpp>
#include <Nazara/Audio/OpenALLibrary.hpp>
#include <Nazara/Audio/OpenALDevice.hpp>
#include <Nazara/Audio/Formats/drwavLoader.hpp>
#include <Nazara/Audio/Formats/libflacLoader.hpp>
#include <Nazara/Audio/Formats/libvorbisLoader.hpp>

View File

@ -3,6 +3,7 @@
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Audio/OpenALLibrary.hpp>
#include <Nazara/Audio/OpenALDevice.hpp>
#include <Nazara/Core/Algorithm.hpp>
#include <Nazara/Core/Error.hpp>
#include <Nazara/Core/ErrorFlags.hpp>
@ -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,14 +85,31 @@ 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 <Nazara/Audio/OpenALFunctions.hpp>
// 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<decltype(name)>(alGetProcAddress(#name));
#include <Nazara/Audio/OpenALFunctions.hpp>
PostLoad();
return true;
#endif
}
std::vector<std::string> 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 <Nazara/Audio/OpenALFunctions.hpp>
m_library.Unload();
}

View File

@ -4,6 +4,7 @@
#include <Nazara/Audio/OpenALSource.hpp>
#include <Nazara/Audio/OpenALBuffer.hpp>
#include <Nazara/Audio/OpenALDevice.hpp>
#include <Nazara/Audio/OpenALLibrary.hpp>
#include <Nazara/Core/Algorithm.hpp>
#include <Nazara/Core/Error.hpp>
@ -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;

View File

@ -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 })