Exemplo n.º 1
0
        public WaveFile(string fileName)
        {
            var stream = File.OpenRead(fileName);

            RiffHeader = RiffHeader.GetRiffHeader(stream);
            var pos = stream.Position;

            FormatChunk     = FormatChunk.GetFormatChunk(stream);
            stream.Position = pos + FormatChunk.Size + 8;
            DataChunk       = DataChunk.GetDataChunk(stream);
            if (stream.Length < 12 + 8 + FormatChunk.Size + 8 + DataChunk.Size)
            {
                throw new InvalidDataException("WAVEファイルの形式が不正です。");
            }
            var waveDataStream = new BinaryReader(stream);

            Data = new short[DataChunk.Size / 2];
            unsafe {
                fixed(short *ptr = &Data[0])
                using (var unmanagedStream = new UnmanagedMemoryStream((byte *)ptr, DataChunk.Size, DataChunk.Size, FileAccess.Write))
                    stream.CopyTo(unmanagedStream);
            }
            stream.Dispose();
        }