コード例 #1
0
        /// <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;
        }