From f0b26efcd3742328902518666f0bd754046d17a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 3 Jun 2021 17:20:09 +0200 Subject: [PATCH] Audio/Music: Fix Seek method --- src/Nazara/Audio/Formats/drwavLoader.cpp | 4 ++-- src/Nazara/Audio/Formats/libvorbisLoader.cpp | 8 ++++---- src/Nazara/Audio/Music.cpp | 12 +++++++----- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/Nazara/Audio/Formats/drwavLoader.cpp b/src/Nazara/Audio/Formats/drwavLoader.cpp index 588023d93..31e898e6e 100644 --- a/src/Nazara/Audio/Formats/drwavLoader.cpp +++ b/src/Nazara/Audio/Formats/drwavLoader.cpp @@ -250,7 +250,7 @@ namespace Nz else { UInt64 readSample = drwav_read_pcm_frames_s16(&m_decoder, sampleCount / m_decoder.channels, static_cast(buffer)); - m_readSampleCount += readSample; + m_readSampleCount += readSample * m_decoder.channels; return readSample * m_decoder.channels; } @@ -258,7 +258,7 @@ namespace Nz void Seek(UInt64 offset) override { - drwav_seek_to_pcm_frame(&m_decoder, offset); + drwav_seek_to_pcm_frame(&m_decoder, (m_mixToMono) ? offset : offset / m_decoder.channels); m_readSampleCount = offset; } diff --git a/src/Nazara/Audio/Formats/libvorbisLoader.cpp b/src/Nazara/Audio/Formats/libvorbisLoader.cpp index ca23c3585..67fc81f37 100644 --- a/src/Nazara/Audio/Formats/libvorbisLoader.cpp +++ b/src/Nazara/Audio/Formats/libvorbisLoader.cpp @@ -338,8 +338,8 @@ namespace Nz void Seek(UInt64 offset) override { - if (m_mixToMono) - offset *= m_channelCount; + if (!m_mixToMono) + offset /= m_channelCount; ov_pcm_seek(&m_decoder, Int64(offset)); } @@ -347,8 +347,8 @@ namespace Nz UInt64 Tell() override { UInt64 offset = UInt64(ov_pcm_tell(&m_decoder)); - if (m_mixToMono) - offset /= m_channelCount; + if (!m_mixToMono) + offset *= m_channelCount; return offset; } diff --git a/src/Nazara/Audio/Music.cpp b/src/Nazara/Audio/Music.cpp index cc2615906..8e07cc1d1 100644 --- a/src/Nazara/Audio/Music.cpp +++ b/src/Nazara/Audio/Music.cpp @@ -34,7 +34,7 @@ namespace Nz std::mutex bufferLock; std::shared_ptr stream; std::thread thread; - UInt64 playingOffset; + UInt64 streamOffset; bool loop = false; unsigned int sampleRate; }; @@ -342,8 +342,10 @@ namespace Nz if (isPlaying) Stop(); - m_impl->playingOffset = offset; - m_impl->processedSamples = UInt64(offset) * m_impl->sampleRate * GetChannelCount(m_impl->stream->GetFormat()) / 1000ULL; + UInt64 sampleOffset = UInt64(offset) * m_impl->sampleRate * GetChannelCount(m_impl->stream->GetFormat()) / 1000ULL; + + m_impl->processedSamples = sampleOffset; + m_impl->streamOffset = sampleOffset; if (isPlaying) Play(); @@ -371,7 +373,7 @@ namespace Nz { std::lock_guard lock(m_impl->stream->GetMutex()); - m_impl->stream->Seek(m_impl->playingOffset); + m_impl->stream->Seek(m_impl->streamOffset); // Fill the buffer by reading from the stream for (;;) @@ -388,7 +390,7 @@ namespace Nz break; } - m_impl->playingOffset = m_impl->stream->Tell(); + m_impl->streamOffset = m_impl->stream->Tell(); } // Update the buffer (send it to OpenAL) and queue it if we got any data