private void ReadHeader()
{
BinaryReader Reader = new BinaryReader(m_Stream);
if (ReadChunk(Reader) != "RIFF")
throw new Exception("Invalid file format");
Reader.ReadInt32(); // File length minus first 8 bytes of RIFF description, we don't use it
if (ReadChunk(Reader) != "WAVE")
throw new Exception("Invalid file format");
if (ReadChunk(Reader) != "fmt ")
throw new Exception("Invalid file format");
int len = Reader.ReadInt32();
if (len < 16) // bad format chunk length
throw new Exception("Invalid file format");
m_Format = new WaveFormat(22050, 16, 2); // initialize to any format
m_Format.wFormatTag = Reader.ReadInt16();
m_Format.nChannels = Reader.ReadInt16();
m_Format.nSamplesPerSec = Reader.ReadInt32();
m_Format.nAvgBytesPerSec = Reader.ReadInt32();
m_Format.nBlockAlign = Reader.ReadInt16();
m_Format.wBitsPerSample = Reader.ReadInt16();
// advance in the stream to skip the wave format block
len -= 16; // minimum format size
while (len > 0)
{
Reader.ReadByte();
len--;
}
// assume the data chunk is aligned
while(m_Stream.Position < m_Stream.Length && ReadChunk(Reader) != "data")
;
if (m_Stream.Position >= m_Stream.Length)
throw new Exception("Invalid file format");
m_Length = Reader.ReadInt32();
m_DataPos = m_Stream.Position;
Position = 0;
}