private RiffSubChunk ParseSubChunk(BinaryReader reader) { string id = reader.ReadUTF8(4); reader.BaseStream.Position -= 4; long startOffset = reader.BaseStream.Position + 8; RiffSubChunk subChunk = RegisteredSubChunks.TryGetValue(id, out Func <RiffParser, BinaryReader, RiffSubChunk> parser) ? parser(this, reader) : new RiffSubChunk(reader); long endOffset = startOffset + subChunk.SubChunkSize; int remainingBytes = (int)Math.Max(endOffset - reader.BaseStream.Position, 0); subChunk.Extra = reader.ReadBytes(remainingBytes); reader.BaseStream.Position = endOffset + (endOffset & 1); // Subchunks are 2-byte aligned return(subChunk); }
public void ParseRiff(Stream file) { using (BinaryReader reader = GetBinaryReader(file, Endianness.LittleEndian)) { RiffChunk = RiffChunk.Parse(reader); SubChunks.Clear(); // Size is counted from after the ChunkSize field, not the RiffType field long startOffset = reader.BaseStream.Position - 4; long endOffset = startOffset + RiffChunk.Size; // Make sure 8 bytes are available for the subchunk header while (reader.BaseStream.Position + 8 < endOffset) { RiffSubChunk subChunk = ParseSubChunk(reader); SubChunks[subChunk.SubChunkId] = subChunk; } } }