diff --git a/src/SFML/Audio/SoundFileReaderWav.cpp b/src/SFML/Audio/SoundFileReaderWav.cpp index 5323f51144..6706bc4590 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_dataEnd (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_dataEnd)) { switch (m_bytesPerSample) { @@ -285,8 +286,9 @@ bool SoundFileReaderWav::parseHeader(Info& info) // Compute the total number of samples info.sampleCount = subChunkSize / m_bytesPerSample; - // Store the starting position of samples in the file + // Store the start and end position of samples in the file m_dataStart = m_stream->tell(); + m_dataEnd = m_dataStart + info.sampleCount * m_bytesPerSample; dataChunkFound = true; } diff --git a/src/SFML/Audio/SoundFileReaderWav.hpp b/src/SFML/Audio/SoundFileReaderWav.hpp index a52bc1f4e1..015518dd00 100644 --- a/src/SFML/Audio/SoundFileReaderWav.hpp +++ b/src/SFML/Audio/SoundFileReaderWav.hpp @@ -111,6 +111,7 @@ class SoundFileReaderWav : public SoundFileReader 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_dataEnd; ///< Position one byte past the end of the audio data in the open file }; } // namespace priv