Uint64 SoundFileReaderWav::read(Int16* samples, Uint64 maxCount) { assert(m_stream); Uint64 count = 0; Uint64 startPos = m_stream->tell(); // Tracking of m_dataEnd is important to prevent sf::Music from reading // data until EOF, as WAV files may have metadata at the end. while ((count < maxCount) && (startPos + count * m_bytesPerSample < m_dataEnd)) { switch (m_bytesPerSample) { case 1: { Uint8 sample = 0; if (decode(*m_stream, sample)) *samples++ = (static_cast<Int16>(sample) - 128) << 8; else return count; break; } case 2: { Int16 sample = 0; if (decode(*m_stream, sample)) *samples++ = sample; else return count; break; } case 3: { Uint32 sample = 0; if (decode24bit(*m_stream, sample)) *samples++ = sample >> 8; else return count; break; } case 4: { Uint32 sample = 0; if (decode(*m_stream, sample)) *samples++ = sample >> 16; else return count; break; } default: { assert(false); return 0; } }
Uint64 SoundFileReaderWav::read(Int16* samples, Uint64 maxCount) { assert(m_stream); Uint64 count = 0; while ((count < maxCount) && (m_stream->tell() < m_dataEnd)) { switch (m_bytesPerSample) { case 1: { Uint8 sample = 0; if (decode(*m_stream, sample)) *samples++ = (static_cast<Int16>(sample) - 128) << 8; else return count; break; } case 2: { Int16 sample = 0; if (decode(*m_stream, sample)) *samples++ = sample; else return count; break; } case 3: { Uint32 sample = 0; if (decode24bit(*m_stream, sample)) *samples++ = sample >> 8; else return count; break; } case 4: { Uint32 sample = 0; if (decode(*m_stream, sample)) *samples++ = sample >> 16; else return count; break; } default: { assert(false); return 0; } }