This would fix this bug.
It adds a check before reading each sample in the loop in read to see if the wav data section ended (using same way to turn sample count to offset like seek function already does).
diff --git a/src/SFML/Audio/SoundFileReaderWav.cpp b/src/SFML/Audio/SoundFileReaderWav.cpp
index 5323f51..4e86f5b 100644
--- a/src/SFML/Audio/SoundFileReaderWav.cpp
+++ b/src/SFML/Audio/SoundFileReaderWav.cpp
@@ -110,7 +110,8 @@ bool SoundFileReaderWav::check(InputStream& stream)
SoundFileReaderWav::SoundFileReaderWav() :
m_stream (NULL),
m_bytesPerSample(0),
-m_dataStart (0)
+m_dataStart (0),
+m_sampleCount (0)
{
}
@@ -145,7 +146,7 @@ Uint64 SoundFileReaderWav::read(Int16* samples, Uint64 maxCount)
assert(m_stream);
Uint64 count = 0;
- while (count < maxCount)
+ while (count < maxCount && m_stream->tell() < m_dataStart + m_sampleCount * m_bytesPerSample)
{
switch (m_bytesPerSample)
{
@@ -283,7 +284,8 @@ bool SoundFileReaderWav::parseHeader(Info& info)
// "data" chunk
// Compute the total number of samples
- info.sampleCount = subChunkSize / m_bytesPerSample;
+ m_sampleCount = subChunkSize / m_bytesPerSample;
+ info.sampleCount = m_sampleCount;
// Store the starting position of samples in the file
m_dataStart = m_stream->tell();
diff --git a/src/SFML/Audio/SoundFileReaderWav.hpp b/src/SFML/Audio/SoundFileReaderWav.hpp
index a52bc1f..a824cdb 100644
--- a/src/SFML/Audio/SoundFileReaderWav.hpp
+++ b/src/SFML/Audio/SoundFileReaderWav.hpp
@@ -111,6 +111,7 @@ private:
InputStream* m_stream; ///< Source stream to read from
unsigned int m_bytesPerSample; ///< Size of a sample, in bytes
Uint64 m_dataStart; ///< Starting position of the audio data in the open file
+ Uint64 m_sampleCount;
};
} // namespace priv