public static bool ParseWavHeader(byte[] header, out WavFileInfo info) { //Parse int pos = 0; string fileTag = ReadWavTag(header, ref pos); int fileLen = ReadWavInt32(header, ref pos); string wavTag = ReadWavTag(header, ref pos); string fmtTag = ReadWavTag(header, ref pos); ReadWavInt32(header, ref pos); //Unknown, 16 short formatTag = ReadWavInt16(header, ref pos); short channels = ReadWavInt16(header, ref pos); int fileSampleRate = ReadWavInt32(header, ref pos); int avgBytesPerSec = ReadWavInt32(header, ref pos); short blockAlign = ReadWavInt16(header, ref pos); short bitsPerSample = ReadWavInt16(header, ref pos); string dataTag = ReadWavTag(header, ref pos); int dataLen = ReadWavInt32(header, ref pos); //Validate if (fileTag != "RIFF" || wavTag != "WAVE" || fmtTag != "fmt " || dataTag != "data") { info = new WavFileInfo(); return(false); } //Create info = new WavFileInfo { bitsPerSample = bitsPerSample, channels = channels, sampleRate = fileSampleRate }; return(true); }
public static byte[] CreateHeader(WavFileInfo info, int length = -1) { //Allocate byte[] buffer = new byte[HEADER_LENGTH]; int offset = 0; //Calculate short blockAlign = (short)(info.channels * (info.bitsPerSample / 8)); int avgBytesPerSec = info.sampleRate * (int)blockAlign; //Write WriteTag(buffer, ref offset, "RIFF"); WriteSignedInt(buffer, ref offset, length); //Length WriteTag(buffer, ref offset, "WAVE"); WriteTag(buffer, ref offset, "fmt "); WriteSignedInt(buffer, ref offset, 16); WriteSignedShort(buffer, ref offset, 1); //Format tag WriteSignedShort(buffer, ref offset, info.channels); WriteSignedInt(buffer, ref offset, info.sampleRate); WriteSignedInt(buffer, ref offset, avgBytesPerSec); WriteSignedShort(buffer, ref offset, blockAlign); WriteSignedShort(buffer, ref offset, info.bitsPerSample); WriteTag(buffer, ref offset, "data"); WriteSignedInt(buffer, ref offset, length); //Length return(buffer); }
public static bool IdentifyWavFile(string path, out WavFileInfo info) { bool ok; byte[] header = new byte[WavHeaderUtil.HEADER_LENGTH]; using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { fs.Read(header, 0, WavHeaderUtil.HEADER_LENGTH); ok = WavHeaderUtil.ParseWavHeader(header, out info); } return(ok); }
public WavFileWriter(Stream underlyingStream, int sampleRate, short channels, SampleFormat format, int bufferSize) : base(underlyingStream) { //Create wrapper writer = new StreamSampleWriter(underlyingStream, format, sampleRate, WavHeaderUtil.HEADER_LENGTH, channels, bufferSize); //Create info info = new WavFileInfo { bitsPerSample = writer.BitsPerSample, channels = channels, sampleRate = sampleRate }; //Write header byte[] header = WavHeaderUtil.CreateHeader(info); underlyingStream.Position = 0; underlyingStream.Write(header, 0, header.Length); }
public static bool ParseWavHeader(Stream s, out WavFileInfo info) { byte[] data = new byte[WavHeaderUtil.HEADER_LENGTH]; s.Read(data, 0, data.Length); return(ParseWavHeader(data, out info)); }