Made WAV file reader no longer assume that data chunk goes till end

of file to prevent reading trailing metadata as samples.
This commit is contained in:
frex 2015-12-09 18:32:39 +01:00 committed by Lukas Dürrenberger
parent 499eb09642
commit 698bbccd6a
2 changed files with 6 additions and 3 deletions

View File

@ -110,7 +110,8 @@ bool SoundFileReaderWav::check(InputStream& stream)
SoundFileReaderWav::SoundFileReaderWav() : SoundFileReaderWav::SoundFileReaderWav() :
m_stream (NULL), m_stream (NULL),
m_bytesPerSample(0), 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); assert(m_stream);
Uint64 count = 0; Uint64 count = 0;
while (count < maxCount) while ((count < maxCount) && (m_stream->tell() < m_dataEnd))
{ {
switch (m_bytesPerSample) switch (m_bytesPerSample)
{ {
@ -285,8 +286,9 @@ bool SoundFileReaderWav::parseHeader(Info& info)
// Compute the total number of samples // Compute the total number of samples
info.sampleCount = subChunkSize / m_bytesPerSample; 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_dataStart = m_stream->tell();
m_dataEnd = m_dataStart + info.sampleCount * m_bytesPerSample;
dataChunkFound = true; dataChunkFound = true;
} }

View File

@ -111,6 +111,7 @@ private:
InputStream* m_stream; ///< Source stream to read from InputStream* m_stream; ///< Source stream to read from
unsigned int m_bytesPerSample; ///< Size of a sample, in bytes 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_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 } // namespace priv