#include #include#include#include#include
// https://github.com/mackron/dr_libs/blob/master/dr_wav.h
#define DR_WAV_IMPLEMENTATION#include"dr_wav.h"
#define FRAME_SIZE 480
#define MAX_FRAME_SIZE (6*FRAME_SIZE)
#define MAX_CHANNELS 1
#define MAX_PACKET_SIZE (3*1276)
#pragma pack(push)
#pragma pack(1)
structWavInfo {
uint16_t channels;
uint32_t sampleRate;
uint32_t bitsPerSample;
};#pragma pack(pop)#ifndef nullptr#define nullptr NULL
#endif
classFileStream {public:
FileStream() {
cur_pos= 0;
}void Append(const char *data, size_t size) {if (cur_pos + size >Size()) {
vec.resize(cur_pos+size);
}
memcpy(vec.data()+cur_pos, data, size);
cur_pos+=size;
}voidAppendU32(uint32_t val) {
Append((char *) (&val), sizeof(val));
}char *Data() {returnvec.data();
}
size_t Size() {returnvec.size();
}
size_t Read(void *buff, size_t elemSize, size_t elemCount) {
size_t readed= std::min((vec.size() - cur_pos), (elemCount * elemSize)) /elemSize;if (readed > 0) {
memcpy(buff, vec.data()+ cur_pos, readed *elemSize);
cur_pos+= readed *elemSize;
}returnreaded;
}bool SeekCur(intoffset) {if (cur_pos + offset >vec.size()) {
cur_pos= !vec.empty() ? (vec.size() - 1) : 0;return false;
}else{
cur_pos+=offset;return true;
}
}bool SeekBeg(int offset = 0) {
cur_pos= 0;returnSeekCur(offset);
}bool WriteToFile(const char *filename) {
FILE*fin = fopen(filename, "wb");if (!fin) {return false;
}
fseek(fin,0, SEEK_SET);
fwrite(vec.data(),sizeof(char), vec.size(), fin);
fclose(fin);return true;
}bool ReadFromFile(const char *filename) {
FILE*fin = fopen(filename, "rb");if (!fin) {return false;
}
fseek(fin,0, SEEK_END);long fileSize =ftell(fin);