71 lines
1.5 KiB
C++
71 lines
1.5 KiB
C++
/*
|
|
* 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 <cstdarg>
|
|
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(){}
|
|
}
|