/* * Filename: WavWriter.cpp * * Description: * * * Version: * Created: Mon Mar 9 19:31:28 2020 * Revision: None * Author: Rachel Fae Fox (foxiepaws),fox@foxiepa.ws * */ #include "WavWriter.h" #include namespace amalgam { WavWriter::WavWriter(char* filename, uint srate, uint chan, uint bps) { file = fopen(filename, "w"); sr = srate; ch = chan; bd = bps; length = 0; byterate = sr * ch * (bd/8); blockalign = ch * (bd/8); // initialise the first 40 bytes for the header later. for (int x = 0; x < 40; x++) { fputc(0x00,file); } } void WavWriter::writeHeader() { rewind(file); fprintf(file,"RIFF"); writeBytes((char*) &riffsize,4); fprintf(file,"WAVEfmt "); writeBytes((char*) &fmtsize,4); writeBytes((char*) &type,2); writeBytes((char*) &ch,2); writeBytes((char*) &sr,4); writeBytes((char*) &byterate,4); writeBytes((char*) &blockalign,2); writeBytes((char*) &bd, 2); fprintf(file,"data"); writeBytes((char*) &datasize, 4); } void WavWriter::finalise() { datasize = length; riffsize = 20 + fmtsize + datasize; writeHeader(); fclose(file); } void WavWriter::write(...) { va_list args; va_start(args, ch); for (int i=0;i < ch;i++) { uint32_t v = va_arg(args,int); writeBytes((char*) &v,(bd/8)); } va_end(args); } void WavWriter::writeBytes(char* bytes, uint count) { for (int i = 0; i < count ; i++) { length++; putc(bytes[i],file); } } WavWriter::~WavWriter(){} }