Это простой класс для создания wav-файла с разной частотой (11025, 22050, 44100) и каналами (1-моно или 2-стерео). Здесь используется 8-битный диапазон звука (от 0 до 255).
struct __attribute__((__packed__)) WAVEFMTHEADER {
unsigned int chunkId;
unsigned int chunkSize;
unsigned int format;
unsigned int subchunk1Id;
unsigned int subchunk1Size;
unsigned short audioFormat;
unsigned short numChannels;
unsigned int sampleRate;
unsigned int byteRate;
unsigned short blockAlign;
unsigned short bitsPerSample;
unsigned int subchunk2Id;
unsigned int subchunk2Size;
};
class Twave {
protected:
unsigned int frequency = 44100;
unsigned short channels = 2;
unsigned int wav_size = 0;
unsigned int top = 0;
unsigned char* data = NULL;
public:
Twave(int _frequency = 44100, int _channels = 2) {
frequency = _frequency;
channels = _channels;
top = 0;
wav_size = 0;
data = NULL;
}
~Twave() {
if (data) free(data);
}
void add(unsigned char lf, unsigned char rt = 0) {
if (wav_size == 0) {
top = frequency * channels;
data = (unsigned char*) malloc(top);
} else if (wav_size >= top) {
top *= 2;
data = (unsigned char*) realloc(data, top);
}
if (channels >= 1) data[wav_size++] = lf;
if (channels == 2) data[wav_size++] = rt;
}
void save(const char* filename) {
unsigned int _wavesize = wav_size + 0x24;
unsigned int _byteinsec = frequency * channels;
struct WAVEFMTHEADER head = {
0x46464952,
_wavesize,
0x45564157,
0x20746d66,
16,
1,
channels,
frequency,
_byteinsec,
channels,
8,
0x61746164,
wav_size
};
FILE* fp = fopen(filename, "wb");
if (fp) {
fseek(fp, 0, SEEK_SET);
fwrite(&head, 1, sizeof(WAVEFMTHEADER), fp);
fwrite(data, 1, wav_size, fp);
fclose(fp);
}
}
};