/* * public struct WaveInCaps * { * public short wMid; * public short wPid; * public int vDriverVersion; * [MarshalAs(UnmanagedType.ByValTStr, SizeConst = WinMM.MAXPNAMELEN)] public string szPname; * public int dwFormats; * public short wChannels; * }*/ #endregion public static byte[] WriteWAVFile(WaveFormat wf, byte[][] rawData) { var bw = new MemoryStream(); var rawSize = 0; for (var j = 0; j < rawData.Length; j++) { rawSize += rawData[j].Length; } //RIFF HEADER bw.Write(Encoding.ASCII.GetBytes("RIFF"), 0, 4); bw.Write(BitConverter.GetBytes(rawSize + 36), 0, 4); bw.Write(Encoding.ASCII.GetBytes("WAVE".ToCharArray()), 0, 4); // SUBCHUNK bw.Write(Encoding.ASCII.GetBytes("fmt ".ToCharArray()), 0, 4); bw.Write(BitConverter.GetBytes(16), 0, 4); var chunk = MarshalUtil.StructureToByteArray(wf); bw.Write(chunk, 0, chunk.Length); // DATA CHUNK bw.Write(Encoding.ASCII.GetBytes("data".ToCharArray()), 0, 4); bw.Write(BitConverter.GetBytes(rawSize), 0, 4); for (var i = 0; i < rawData[0].Length; i += wf.BitsPerSample / 8) { for (var j = 0; j < rawData.Length; j++) { bw.WriteByte(rawData[j][i]); if (wf.BitsPerSample == 16) { bw.WriteByte(rawData[j][i + 1]); } } } return(bw.ToArray()); }
public static void WriteWAVFile(string filePath, WaveFormat wf, byte[][] rawData) { var fileStream = File.OpenWrite(filePath); var rawSize = 0; for (var j = 0; j < rawData.Length; j++) { rawSize += rawData[j].Length; } //RIFF HEADER fileStream.Write(Encoding.ASCII.GetBytes("RIFF"), 0, 4); fileStream.Write(BitConverter.GetBytes(rawSize + 36), 0, 4); fileStream.Write(Encoding.ASCII.GetBytes("WAVE".ToCharArray()), 0, 4); // SUBCHUNK fileStream.Write(Encoding.ASCII.GetBytes("fmt ".ToCharArray()), 0, 4); fileStream.Write(BitConverter.GetBytes(16), 0, 4); var chunk = MarshalUtil.StructureToByteArray(wf); fileStream.Write(chunk, 0, chunk.Length); // DATA CHUNK fileStream.Write(Encoding.ASCII.GetBytes("data".ToCharArray()), 0, 4); fileStream.Write(BitConverter.GetBytes(rawSize), 0, 4); for (var i = 0; i < rawData[0].Length; i += wf.BitsPerSample / 8) { for (var j = 0; j < rawData.Length; j++) { fileStream.WriteByte(rawData[j][i]); if (wf.BitsPerSample == 16) { fileStream.WriteByte(rawData[j][i + 1]); } } } fileStream.Close(); }