From 17b1c2407d3ca62efad1c82ef232b24dd1ff6ffd Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 8 May 2022 15:44:41 +0200 Subject: [PATCH] Audio/AudioSource: Add GetSampleOffsetAndLatency --- include/Nazara/Audio/AudioSource.hpp | 9 +++++++++ include/Nazara/Audio/DummyAudioSource.hpp | 1 + include/Nazara/Audio/OpenALSource.hpp | 1 + src/Nazara/Audio/DummyAudioSource.cpp | 9 +++++++++ src/Nazara/Audio/OpenALSource.cpp | 24 ++++++++++++++++------- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/include/Nazara/Audio/AudioSource.hpp b/include/Nazara/Audio/AudioSource.hpp index 94932d293..c46cfd1c6 100644 --- a/include/Nazara/Audio/AudioSource.hpp +++ b/include/Nazara/Audio/AudioSource.hpp @@ -20,6 +20,8 @@ namespace Nz class NAZARA_AUDIO_API AudioSource { public: + struct OffsetWithLatency; + inline AudioSource(std::shared_ptr device); AudioSource(const AudioSource&) = delete; AudioSource(AudioSource&&) = delete; @@ -34,6 +36,7 @@ namespace Nz virtual float GetPitch() const = 0; virtual Vector3f GetPosition() const = 0; virtual UInt32 GetSampleOffset() const = 0; + virtual OffsetWithLatency GetSampleOffsetAndLatency() const = 0; virtual Vector3f GetVelocity() const = 0; virtual SoundStatus GetStatus() const = 0; virtual float GetVolume() const = 0; @@ -64,6 +67,12 @@ namespace Nz AudioSource& operator=(const AudioSource&) = delete; AudioSource& operator=(AudioSource&&) = delete; + struct OffsetWithLatency + { + UInt64 sampleOffset; + UInt64 sourceLatency; + }; + private: std::shared_ptr m_device; }; diff --git a/include/Nazara/Audio/DummyAudioSource.hpp b/include/Nazara/Audio/DummyAudioSource.hpp index 3fa879772..6848c4c27 100644 --- a/include/Nazara/Audio/DummyAudioSource.hpp +++ b/include/Nazara/Audio/DummyAudioSource.hpp @@ -32,6 +32,7 @@ namespace Nz float GetPitch() const override; Vector3f GetPosition() const override; UInt32 GetSampleOffset() const override; + OffsetWithLatency GetSampleOffsetAndLatency() const override; Vector3f GetVelocity() const override; SoundStatus GetStatus() const override; float GetVolume() const override; diff --git a/include/Nazara/Audio/OpenALSource.hpp b/include/Nazara/Audio/OpenALSource.hpp index 91e8edb31..73afff99d 100644 --- a/include/Nazara/Audio/OpenALSource.hpp +++ b/include/Nazara/Audio/OpenALSource.hpp @@ -36,6 +36,7 @@ namespace Nz float GetPitch() const override; Vector3f GetPosition() const override; UInt32 GetSampleOffset() const override; + OffsetWithLatency GetSampleOffsetAndLatency() const override; Vector3f GetVelocity() const override; SoundStatus GetStatus() const override; float GetVolume() const override; diff --git a/src/Nazara/Audio/DummyAudioSource.cpp b/src/Nazara/Audio/DummyAudioSource.cpp index a6269fb60..ac3d969f5 100644 --- a/src/Nazara/Audio/DummyAudioSource.cpp +++ b/src/Nazara/Audio/DummyAudioSource.cpp @@ -68,6 +68,15 @@ namespace Nz return SafeCast(sampleOffset); } + auto DummyAudioSource::GetSampleOffsetAndLatency() const -> OffsetWithLatency + { + OffsetWithLatency info; + info.sampleOffset = GetSampleOffset() * 1000; + info.sourceLatency = 0; + + return info; + } + Vector3f DummyAudioSource::GetVelocity() const { return m_velocity; diff --git a/src/Nazara/Audio/OpenALSource.cpp b/src/Nazara/Audio/OpenALSource.cpp index aa395151a..8064dd894 100644 --- a/src/Nazara/Audio/OpenALSource.cpp +++ b/src/Nazara/Audio/OpenALSource.cpp @@ -75,23 +75,33 @@ namespace Nz { GetDevice().MakeContextCurrent(); + ALint samples = 0; + m_library.alGetSourcei(m_sourceId, AL_SAMPLE_OFFSET, &samples); + + return SafeCast(samples); + } + + auto OpenALSource::GetSampleOffsetAndLatency() const -> OffsetWithLatency + { + OffsetWithLatency offsetWithLatency; if (GetDevice().IsExtensionSupported(OpenALExtension::SourceLatency)) { + GetDevice().MakeContextCurrent(); + std::array values; m_library.alGetSourcei64vSOFT(m_sourceId, AL_SAMPLE_OFFSET_LATENCY_SOFT, values.data()); - ALint64SOFT sampleOffset = (values[0] & 0xFFFFFFFF00000000) >> 32; - ALint64SOFT latency = values[1] / 1'000'000; + offsetWithLatency.sampleOffset = ((values[0] & 0xFFFFFFFF00000000) >> 32) * 1'000; + offsetWithLatency.sourceLatency = values[1] / 1'000; - return SafeCast(sampleOffset + latency); } else { - ALint samples = 0; - m_library.alGetSourcei(m_sourceId, AL_SAMPLE_OFFSET, &samples); - - return SafeCast(samples); + offsetWithLatency.sampleOffset = GetSampleOffset() * 1'000; + offsetWithLatency.sourceLatency = 0; } + + return offsetWithLatency; } Vector3f OpenALSource::GetVelocity() const