/* 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(); }