public static void ReadHeaders(Stream stream, out FmtHeader fmtHeader, out DataHeader dataHeader, out long dataStart) { if (stream == null) { throw new ArgumentNullException("stream"); } if (!BitConverter.IsLittleEndian) { throw new InvalidOperationException("Unsupported system endianness."); } if (!IsWavStream(stream)) { throw new InvalidOperationException("Invalid WAV header."); } EngineBinaryReader engineBinaryReader = new EngineBinaryReader(stream); fmtHeader = default(FmtHeader); dataHeader = default(DataHeader); dataStart = 0L; stream.Position += 12L; bool flag = false; bool flag2 = false; while (!flag || !flag2) { int num = engineBinaryReader.ReadInt32(); if (num == MakeFourCC("fmt ")) { stream.Position -= 4L; fmtHeader = engineBinaryReader.ReadStruct <FmtHeader>(); flag = true; } else if (num == MakeFourCC("data")) { stream.Position -= 4L; dataHeader = engineBinaryReader.ReadStruct <DataHeader>(); dataStart = stream.Position; flag2 = true; } else { int num2 = engineBinaryReader.ReadInt32(); stream.Position += num2; } } if (fmtHeader.Type != 1 || fmtHeader.ChannelsCount < 1 || fmtHeader.ChannelsCount > 2 || fmtHeader.SamplingFrequency < 8000 || fmtHeader.SamplingFrequency > 48000 || fmtHeader.BitsPerChannel != 16) { throw new InvalidOperationException("Unsupported WAV format."); } }
public static void Save(SoundData soundData, Stream stream) { if (soundData == null) { throw new ArgumentNullException("soundData"); } if (stream == null) { throw new ArgumentNullException("stream"); } EngineBinaryWriter engineBinaryWriter = new EngineBinaryWriter(stream); WavHeader structure = default(WavHeader); structure.Riff = MakeFourCC("RIFF"); structure.FileSize = Utilities.SizeOf <WavHeader>() + Utilities.SizeOf <FmtHeader>() + Utilities.SizeOf <DataHeader>() + soundData.Data.Length; structure.Wave = MakeFourCC("WAVE"); engineBinaryWriter.WriteStruct(structure); FmtHeader structure2 = default(FmtHeader); structure2.Fmt = MakeFourCC("fmt "); structure2.FormatSize = 16; structure2.Type = 1; structure2.ChannelsCount = (short)soundData.ChannelsCount; structure2.SamplingFrequency = soundData.SamplingFrequency; structure2.BytesPerSecond = soundData.ChannelsCount * 2 * soundData.SamplingFrequency; structure2.BytesPerSample = (short)(soundData.ChannelsCount * 2); structure2.BitsPerChannel = 16; engineBinaryWriter.WriteStruct(structure2); DataHeader structure3 = default(DataHeader); structure3.Data = MakeFourCC("data"); structure3.DataSize = soundData.Data.Length * 2; engineBinaryWriter.WriteStruct(structure3); byte[] array = new byte[soundData.Data.Length * 2]; Buffer.BlockCopy(soundData.Data, 0, array, 0, array.Length); stream.Write(array, 0, array.Length); }