/// <summary> /// Initializes the specified stream. /// </summary> /// <param name="stream">The stream.</param> private unsafe void Initialize(Stream stream) { var parser = new RiffParser(stream); FileFormatName = "Unknown"; // Parse Header if (!parser.MoveNext() || parser.Current == null) { ThrowInvalidFileFormat(); return; } // Check that WAVE header is present FileFormatName = parser.Current.Type; if (FileFormatName != "WAVE") { throw new InvalidOperationException("Unsupported " + FileFormatName + " file format. Only WAVE."); } // Parse inside the first chunk parser.Descend(); // Get all the chunk var chunks = parser.GetAllChunks(); // Get "fmt" chunk var fmtChunk = Chunk(chunks, "fmt "); if (fmtChunk.Size < sizeof(WaveFormat.__PcmNative)) { ThrowInvalidFileFormat(); } try { Format = WaveFormat.MarshalFrom(fmtChunk.GetData()); } catch (InvalidOperationException ex) { ThrowInvalidFileFormat(ex); } switch (Format.Encoding) { case WaveFormatEncoding.Pcm: case WaveFormatEncoding.IeeeFloat: case WaveFormatEncoding.Extensible: case WaveFormatEncoding.Adpcm: break; default: ThrowInvalidFileFormat(); break; } // Check for "data" chunk var dataChunk = Chunk(chunks, "data"); startPositionOfData = dataChunk.DataPosition; length = dataChunk.Size; input.Position = startPositionOfData; }