diff --git a/include/Nazara/Audio/OpenAL.hpp b/include/Nazara/Audio/OpenAL.hpp index a141cb99d..dbabfdf46 100644 --- a/include/Nazara/Audio/OpenAL.hpp +++ b/include/Nazara/Audio/OpenAL.hpp @@ -20,6 +20,7 @@ namespace OpenALDetail { #include #include + #include } // If someone has a better idea ... @@ -37,6 +38,10 @@ 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; @@ -53,7 +58,7 @@ using OpenALDetail::ALCuint; using OpenALDetail::ALCushort; using OpenALDetail::ALCvoid; -#define NAZARA_AUDIO_FOREACH_AL_FUNC(cb) \ +#define NAZARA_AUDIO_FOREACH_AL_FUNC(cb, extCb) \ cb(alBuffer3f, OpenALDetail::LPALBUFFER3F) \ cb(alBuffer3i, OpenALDetail::LPALBUFFER3I) \ cb(alBufferData, OpenALDetail::LPALBUFFERDATA) \ @@ -126,9 +131,22 @@ using OpenALDetail::ALCvoid; cb(alSourceStop, OpenALDetail::LPALSOURCESTOP) \ cb(alSourceStopv, OpenALDetail::LPALSOURCESTOPV) \ cb(alSourceUnqueueBuffers, OpenALDetail::LPALSOURCEUNQUEUEBUFFERS) \ - cb(alSpeedOfSound, OpenALDetail::LPALSPEEDOFSOUND) + 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) \ +#define NAZARA_AUDIO_FOREACH_ALC_FUNC(cb, extCb) \ cb(alcCaptureCloseDevice, OpenALDetail::LPALCCAPTURECLOSEDEVICE) \ cb(alcCaptureOpenDevice, OpenALDetail::LPALCCAPTUREOPENDEVICE) \ cb(alcCaptureSamples, OpenALDetail::LPALCCAPTURESAMPLES) \ diff --git a/include/Nazara/Audio/OpenALDevice.hpp b/include/Nazara/Audio/OpenALDevice.hpp index 612a29921..1771a3eac 100644 --- a/include/Nazara/Audio/OpenALDevice.hpp +++ b/include/Nazara/Audio/OpenALDevice.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -22,6 +23,15 @@ namespace Nz { class OpenALLibrary; + enum class OpenALExtension + { + SourceLatency, + + Max = SourceLatency + }; + + constexpr std::size_t OpenALExtensionCount = static_cast(OpenALExtension::Max) + 1; + class NAZARA_AUDIO_API OpenALDevice : public AudioDevice { friend OpenALLibrary; @@ -44,6 +54,7 @@ namespace Nz float GetSpeedOfSound() const override; const void* GetSubSystemIdentifier() const override; + inline bool IsExtensionSupported(OpenALExtension extension) const; bool IsFormatSupported(AudioFormat format) const override; void MakeContextCurrent() const; @@ -62,6 +73,7 @@ namespace Nz private: std::array m_audioFormatValues; + std::array m_extensionStatus; std::string m_renderer; std::string m_vendor; OpenALLibrary& m_library; diff --git a/include/Nazara/Audio/OpenALDevice.inl b/include/Nazara/Audio/OpenALDevice.inl index 047fdcfc9..70a2e69a3 100644 --- a/include/Nazara/Audio/OpenALDevice.inl +++ b/include/Nazara/Audio/OpenALDevice.inl @@ -8,6 +8,11 @@ namespace Nz { + inline bool OpenALDevice::IsExtensionSupported(OpenALExtension extension) const + { + return m_extensionStatus[UnderlyingCast(extension)]; + } + inline ALenum OpenALDevice::TranslateAudioFormat(AudioFormat format) const { return m_audioFormatValues[UnderlyingCast(format)]; diff --git a/include/Nazara/Audio/OpenALLibrary.hpp b/include/Nazara/Audio/OpenALLibrary.hpp index d0d6f0806..c9a1d1c66 100644 --- a/include/Nazara/Audio/OpenALLibrary.hpp +++ b/include/Nazara/Audio/OpenALLibrary.hpp @@ -43,8 +43,8 @@ namespace Nz OpenALLibrary& operator=(OpenALLibrary&&) = delete; #define NAZARA_AUDIO_FUNC(name, sig) sig name; - NAZARA_AUDIO_FOREACH_AL_FUNC(NAZARA_AUDIO_FUNC) - NAZARA_AUDIO_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC) + 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 private: diff --git a/src/Nazara/Audio/OpenALDevice.cpp b/src/Nazara/Audio/OpenALDevice.cpp index 4d5afb3c7..757c0a71f 100644 --- a/src/Nazara/Audio/OpenALDevice.cpp +++ b/src/Nazara/Audio/OpenALDevice.cpp @@ -47,6 +47,10 @@ namespace Nz else if (library.alIsExtensionPresent("AL_LOKI_quadriphonic")) m_audioFormatValues[UnderlyingCast(AudioFormat::I16_Quad)] = m_library.alGetEnumValue("AL_FORMAT_QUAD16_LOKI"); + m_extensionStatus.fill(false); + if (library.alIsExtensionPresent("AL_SOFT_source_latency")) + m_extensionStatus[UnderlyingCast(OpenALExtension::SourceLatency)] = true; + SetListenerDirection(Vector3f::Forward()); } diff --git a/src/Nazara/Audio/OpenALLibrary.cpp b/src/Nazara/Audio/OpenALLibrary.cpp index b7703411d..718787041 100644 --- a/src/Nazara/Audio/OpenALLibrary.cpp +++ b/src/Nazara/Audio/OpenALLibrary.cpp @@ -50,7 +50,7 @@ namespace Nz if (!m_library.Load(libname)) continue; - auto LoadSymbol = [this](const char* name) + auto LoadSymbol = [this](const char* name, bool optional) { DynLibFunc funcPtr = m_library.GetSymbol(name); if (!funcPtr) @@ -61,10 +61,12 @@ namespace Nz try { -#define NAZARA_AUDIO_FUNC(name, sig) name = reinterpret_cast(LoadSymbol(#name)); - NAZARA_AUDIO_FOREACH_AL_FUNC(NAZARA_AUDIO_FUNC) - NAZARA_AUDIO_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC) +#define NAZARA_AUDIO_FUNC(name, sig) name = reinterpret_cast(LoadSymbol(#name, false)); +#define NAZARA_AUDIO_EXT_FUNC(name, sig) name = reinterpret_cast(LoadSymbol(#name, true)); + NAZARA_AUDIO_FOREACH_AL_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_EXT_FUNC) + NAZARA_AUDIO_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_EXT_FUNC) #undef NAZARA_AUDIO_FUNC +#undef NAZARA_AUDIO_EXT_FUNC } catch (const std::exception& e) { @@ -110,8 +112,8 @@ namespace Nz return; #define NAZARA_AUDIO_FUNC(name, sig) name = nullptr; - NAZARA_AUDIO_FOREACH_AL_FUNC(NAZARA_AUDIO_FUNC) - NAZARA_AUDIO_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC) + 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 m_library.Unload(); diff --git a/src/Nazara/Audio/OpenALSource.cpp b/src/Nazara/Audio/OpenALSource.cpp index 4f91fc4d9..aa395151a 100644 --- a/src/Nazara/Audio/OpenALSource.cpp +++ b/src/Nazara/Audio/OpenALSource.cpp @@ -75,10 +75,23 @@ namespace Nz { GetDevice().MakeContextCurrent(); - ALint samples = 0; - m_library.alGetSourcei(m_sourceId, AL_SAMPLE_OFFSET, &samples); + if (GetDevice().IsExtensionSupported(OpenALExtension::SourceLatency)) + { + std::array values; + m_library.alGetSourcei64vSOFT(m_sourceId, AL_SAMPLE_OFFSET_LATENCY_SOFT, values.data()); - return SafeCast(samples); + ALint64SOFT sampleOffset = (values[0] & 0xFFFFFFFF00000000) >> 32; + ALint64SOFT latency = values[1] / 1'000'000; + + return SafeCast(sampleOffset + latency); + } + else + { + ALint samples = 0; + m_library.alGetSourcei(m_sourceId, AL_SAMPLE_OFFSET, &samples); + + return SafeCast(samples); + } } Vector3f OpenALSource::GetVelocity() const