/// <summary> /// A bare bones WAV file header writer /// </summary> private static void WriteWavHeader(Stream stream) { // Data length to be fixed up later int dataLength = 0; // We need to use a memory stream because the BinaryWriter will close the underlying stream when it is closed MemoryStream memStream = null; BinaryWriter bw = null; // FXCop note: This try/finally block may look strange, but it is // the recommended way to correctly dispose a stream that is used // by a writer to avoid the stream from being double disposed. // For more information see FXCop rule: CA2202 try { memStream = new MemoryStream(64); WAVEFORMATEX format = new WAVEFORMATEX { FormatTag = 1, Channels = 1, SamplesPerSec = 16000, AvgBytesPerSec = 32000, BlockAlign = 2, BitsPerSample = 16, Size = 0 }; bw = new BinaryWriter(memStream); // RIFF header WriteHeaderString(memStream, RiffHeaderTag); bw.Write(dataLength + FullHeaderSize - 8); // File size - 8 WriteHeaderString(memStream, "WAVE"); WriteHeaderString(memStream, "fmt "); bw.Write(WaveformatExSize); // WAVEFORMATEX bw.Write(format.FormatTag); bw.Write(format.Channels); bw.Write(format.SamplesPerSec); bw.Write(format.AvgBytesPerSec); bw.Write(format.BlockAlign); bw.Write(format.BitsPerSample); bw.Write(format.Size); // data header WriteHeaderString(memStream, DataHeaderTag); bw.Write(dataLength); memStream.WriteTo(stream); } finally { if (bw != null) { memStream = null; bw.Dispose(); } if (memStream != null) { memStream.Dispose(); } } }