/* Read http://z0b.kapsi.fi/snippets.php before using this code. Thank you. */ // Two helper functions for writing 16- and 32-bit unsigned integers. // Feel free to replace. static void write16(const uint16_t v, FILE *f) { fwrite(&v, sizeof(uint16_t), 1, f); } static void write32(const uint32_t v, FILE *f) { fwrite(&v, sizeof(uint32_t), 1, f); } // this is what you need to call static void writeWAVHeader(FILE *f, const uint16_t channels, const uint32_t sampleRate, const uint16_t bitsPerSample, const uint32_t size) { if (!f) return; // Write RIFF chunk start and the file size. Smallest possible // header is 44 bytes, excluding the 8 RIFF chunk bytes. fputs("RIFF", f); write32(size + 44UL - 8UL, f); // wave subchunk (strange, it has no size?) fputs("WAVE", f); // format subchunk fputs("fmt ", f); write32(16, f); // 16 = PCM write16(1, f); // 1 = PCM, linear quantization write16(channels, f); write32(sampleRate, f); write32(sampleRate * channels * bitsPerSample / 8, f); // byteRate write16(channels * bitsPerSample / 8, f); // blockAlign write16(bitsPerSample, f); // data subchunk fputs("data", f); write32(size, f); } // example usage (CD-quality sound): FILE *wav; std::vector data; ... writeWAVHeader(wav, 2, 44100, 16, data.size()); fwrite(&data[0], 2, data.size(), wav); ...