Audio: Add support for AL_SOFT_source_latency
This commit is contained in:
parent
b8b0057ca3
commit
4794073b73
|
|
@ -20,6 +20,7 @@ namespace OpenALDetail
|
||||||
{
|
{
|
||||||
#include <AL/al.h>
|
#include <AL/al.h>
|
||||||
#include <AL/alc.h>
|
#include <AL/alc.h>
|
||||||
|
#include <AL/alext.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
// If someone has a better idea ...
|
// If someone has a better idea ...
|
||||||
|
|
@ -37,6 +38,10 @@ using OpenALDetail::ALuint;
|
||||||
using OpenALDetail::ALushort;
|
using OpenALDetail::ALushort;
|
||||||
using OpenALDetail::ALvoid;
|
using OpenALDetail::ALvoid;
|
||||||
|
|
||||||
|
// SOFT_source_latency
|
||||||
|
using OpenALDetail::ALint64SOFT;
|
||||||
|
using OpenALDetail::ALuint64SOFT;
|
||||||
|
|
||||||
using OpenALDetail::ALCboolean;
|
using OpenALDetail::ALCboolean;
|
||||||
using OpenALDetail::ALCbyte;
|
using OpenALDetail::ALCbyte;
|
||||||
using OpenALDetail::ALCchar;
|
using OpenALDetail::ALCchar;
|
||||||
|
|
@ -53,7 +58,7 @@ using OpenALDetail::ALCuint;
|
||||||
using OpenALDetail::ALCushort;
|
using OpenALDetail::ALCushort;
|
||||||
using OpenALDetail::ALCvoid;
|
using OpenALDetail::ALCvoid;
|
||||||
|
|
||||||
#define NAZARA_AUDIO_FOREACH_AL_FUNC(cb) \
|
#define NAZARA_AUDIO_FOREACH_AL_FUNC(cb, extCb) \
|
||||||
cb(alBuffer3f, OpenALDetail::LPALBUFFER3F) \
|
cb(alBuffer3f, OpenALDetail::LPALBUFFER3F) \
|
||||||
cb(alBuffer3i, OpenALDetail::LPALBUFFER3I) \
|
cb(alBuffer3i, OpenALDetail::LPALBUFFER3I) \
|
||||||
cb(alBufferData, OpenALDetail::LPALBUFFERDATA) \
|
cb(alBufferData, OpenALDetail::LPALBUFFERDATA) \
|
||||||
|
|
@ -126,9 +131,22 @@ using OpenALDetail::ALCvoid;
|
||||||
cb(alSourceStop, OpenALDetail::LPALSOURCESTOP) \
|
cb(alSourceStop, OpenALDetail::LPALSOURCESTOP) \
|
||||||
cb(alSourceStopv, OpenALDetail::LPALSOURCESTOPV) \
|
cb(alSourceStopv, OpenALDetail::LPALSOURCESTOPV) \
|
||||||
cb(alSourceUnqueueBuffers, OpenALDetail::LPALSOURCEUNQUEUEBUFFERS) \
|
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(alcCaptureCloseDevice, OpenALDetail::LPALCCAPTURECLOSEDEVICE) \
|
||||||
cb(alcCaptureOpenDevice, OpenALDetail::LPALCCAPTUREOPENDEVICE) \
|
cb(alcCaptureOpenDevice, OpenALDetail::LPALCCAPTUREOPENDEVICE) \
|
||||||
cb(alcCaptureSamples, OpenALDetail::LPALCCAPTURESAMPLES) \
|
cb(alcCaptureSamples, OpenALDetail::LPALCCAPTURESAMPLES) \
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
#include <Nazara/Audio/Config.hpp>
|
#include <Nazara/Audio/Config.hpp>
|
||||||
#include <Nazara/Audio/Enums.hpp>
|
#include <Nazara/Audio/Enums.hpp>
|
||||||
#include <Nazara/Audio/OpenAL.hpp>
|
#include <Nazara/Audio/OpenAL.hpp>
|
||||||
|
#include <Nazara/Core/Algorithm.hpp>
|
||||||
#include <Nazara/Core/MovablePtr.hpp>
|
#include <Nazara/Core/MovablePtr.hpp>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
@ -22,6 +23,15 @@ namespace Nz
|
||||||
{
|
{
|
||||||
class OpenALLibrary;
|
class OpenALLibrary;
|
||||||
|
|
||||||
|
enum class OpenALExtension
|
||||||
|
{
|
||||||
|
SourceLatency,
|
||||||
|
|
||||||
|
Max = SourceLatency
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr std::size_t OpenALExtensionCount = static_cast<std::size_t>(OpenALExtension::Max) + 1;
|
||||||
|
|
||||||
class NAZARA_AUDIO_API OpenALDevice : public AudioDevice
|
class NAZARA_AUDIO_API OpenALDevice : public AudioDevice
|
||||||
{
|
{
|
||||||
friend OpenALLibrary;
|
friend OpenALLibrary;
|
||||||
|
|
@ -44,6 +54,7 @@ namespace Nz
|
||||||
float GetSpeedOfSound() const override;
|
float GetSpeedOfSound() const override;
|
||||||
const void* GetSubSystemIdentifier() const override;
|
const void* GetSubSystemIdentifier() const override;
|
||||||
|
|
||||||
|
inline bool IsExtensionSupported(OpenALExtension extension) const;
|
||||||
bool IsFormatSupported(AudioFormat format) const override;
|
bool IsFormatSupported(AudioFormat format) const override;
|
||||||
|
|
||||||
void MakeContextCurrent() const;
|
void MakeContextCurrent() const;
|
||||||
|
|
@ -62,6 +73,7 @@ namespace Nz
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::array<ALenum, AudioFormatCount> m_audioFormatValues;
|
std::array<ALenum, AudioFormatCount> m_audioFormatValues;
|
||||||
|
std::array<bool, OpenALExtensionCount> m_extensionStatus;
|
||||||
std::string m_renderer;
|
std::string m_renderer;
|
||||||
std::string m_vendor;
|
std::string m_vendor;
|
||||||
OpenALLibrary& m_library;
|
OpenALLibrary& m_library;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,11 @@
|
||||||
|
|
||||||
namespace Nz
|
namespace Nz
|
||||||
{
|
{
|
||||||
|
inline bool OpenALDevice::IsExtensionSupported(OpenALExtension extension) const
|
||||||
|
{
|
||||||
|
return m_extensionStatus[UnderlyingCast(extension)];
|
||||||
|
}
|
||||||
|
|
||||||
inline ALenum OpenALDevice::TranslateAudioFormat(AudioFormat format) const
|
inline ALenum OpenALDevice::TranslateAudioFormat(AudioFormat format) const
|
||||||
{
|
{
|
||||||
return m_audioFormatValues[UnderlyingCast(format)];
|
return m_audioFormatValues[UnderlyingCast(format)];
|
||||||
|
|
|
||||||
|
|
@ -43,8 +43,8 @@ namespace Nz
|
||||||
OpenALLibrary& operator=(OpenALLibrary&&) = delete;
|
OpenALLibrary& operator=(OpenALLibrary&&) = delete;
|
||||||
|
|
||||||
#define NAZARA_AUDIO_FUNC(name, sig) sig name;
|
#define NAZARA_AUDIO_FUNC(name, sig) sig name;
|
||||||
NAZARA_AUDIO_FOREACH_AL_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_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC)
|
||||||
#undef NAZARA_AUDIO_FUNC
|
#undef NAZARA_AUDIO_FUNC
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,10 @@ namespace Nz
|
||||||
else if (library.alIsExtensionPresent("AL_LOKI_quadriphonic"))
|
else if (library.alIsExtensionPresent("AL_LOKI_quadriphonic"))
|
||||||
m_audioFormatValues[UnderlyingCast(AudioFormat::I16_Quad)] = m_library.alGetEnumValue("AL_FORMAT_QUAD16_LOKI");
|
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());
|
SetListenerDirection(Vector3f::Forward());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ namespace Nz
|
||||||
if (!m_library.Load(libname))
|
if (!m_library.Load(libname))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto LoadSymbol = [this](const char* name)
|
auto LoadSymbol = [this](const char* name, bool optional)
|
||||||
{
|
{
|
||||||
DynLibFunc funcPtr = m_library.GetSymbol(name);
|
DynLibFunc funcPtr = m_library.GetSymbol(name);
|
||||||
if (!funcPtr)
|
if (!funcPtr)
|
||||||
|
|
@ -61,10 +61,12 @@ namespace Nz
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#define NAZARA_AUDIO_FUNC(name, sig) name = reinterpret_cast<sig>(LoadSymbol(#name));
|
#define NAZARA_AUDIO_FUNC(name, sig) name = reinterpret_cast<sig>(LoadSymbol(#name, false));
|
||||||
NAZARA_AUDIO_FOREACH_AL_FUNC(NAZARA_AUDIO_FUNC)
|
#define NAZARA_AUDIO_EXT_FUNC(name, sig) name = reinterpret_cast<sig>(LoadSymbol(#name, true));
|
||||||
NAZARA_AUDIO_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC)
|
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_FUNC
|
||||||
|
#undef NAZARA_AUDIO_EXT_FUNC
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
|
|
@ -110,8 +112,8 @@ namespace Nz
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#define NAZARA_AUDIO_FUNC(name, sig) name = nullptr;
|
#define NAZARA_AUDIO_FUNC(name, sig) name = nullptr;
|
||||||
NAZARA_AUDIO_FOREACH_AL_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_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC)
|
||||||
#undef NAZARA_AUDIO_FUNC
|
#undef NAZARA_AUDIO_FUNC
|
||||||
|
|
||||||
m_library.Unload();
|
m_library.Unload();
|
||||||
|
|
|
||||||
|
|
@ -75,10 +75,23 @@ namespace Nz
|
||||||
{
|
{
|
||||||
GetDevice().MakeContextCurrent();
|
GetDevice().MakeContextCurrent();
|
||||||
|
|
||||||
ALint samples = 0;
|
if (GetDevice().IsExtensionSupported(OpenALExtension::SourceLatency))
|
||||||
m_library.alGetSourcei(m_sourceId, AL_SAMPLE_OFFSET, &samples);
|
{
|
||||||
|
std::array<ALint64SOFT, 2> values;
|
||||||
|
m_library.alGetSourcei64vSOFT(m_sourceId, AL_SAMPLE_OFFSET_LATENCY_SOFT, values.data());
|
||||||
|
|
||||||
return SafeCast<UInt32>(samples);
|
ALint64SOFT sampleOffset = (values[0] & 0xFFFFFFFF00000000) >> 32;
|
||||||
|
ALint64SOFT latency = values[1] / 1'000'000;
|
||||||
|
|
||||||
|
return SafeCast<UInt32>(sampleOffset + latency);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ALint samples = 0;
|
||||||
|
m_library.alGetSourcei(m_sourceId, AL_SAMPLE_OFFSET, &samples);
|
||||||
|
|
||||||
|
return SafeCast<UInt32>(samples);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3f OpenALSource::GetVelocity() const
|
Vector3f OpenALSource::GetVelocity() const
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue