49wav_writer_t *
wav_writer_open(
const char *filepath,
int sample_rate,
int channels) {
50 if (!filepath || sample_rate <= 0 || channels <= 0 || channels > 2) {
54 wav_writer_t *writer = SAFE_MALLOC(
sizeof(wav_writer_t), wav_writer_t *);
65 writer->samples_written = 0;
66 writer->sample_rate = sample_rate;
67 writer->channels = channels;
72 .wave = {
'W',
'A',
'V',
'E'}};
77 .num_channels = (uint16_t)channels,
78 .sample_rate = (uint32_t)sample_rate,
79 .byte_rate = (uint32_t)(sample_rate * channels *
sizeof(
float)),
80 .block_align = (uint16_t)(channels *
sizeof(float)),
81 .bits_per_sample = 32};
84 .
data = {
'd',
'a',
't',
'a'},
88 fwrite(&riff,
sizeof(riff), 1, writer->file);
89 fwrite(&fmt,
sizeof(fmt), 1, writer->file);
90 fwrite(&data,
sizeof(data), 1, writer->file);
96 if (!writer || !writer->file || !samples || num_samples <= 0) {
100 size_t written = fwrite(samples,
sizeof(
float), num_samples, writer->file);
101 if (written != (
size_t)num_samples) {
105 writer->samples_written += num_samples;
108 fflush(writer->file);
120 uint32_t data_size = (uint32_t)(writer->samples_written *
sizeof(
float));
121 uint32_t file_size = data_size + 36;
124 fseek(writer->file, 4, SEEK_SET);
125 fwrite(&file_size,
sizeof(uint32_t), 1, writer->file);
128 fseek(writer->file, 40, SEEK_SET);
129 fwrite(&data_size,
sizeof(uint32_t), 1, writer->file);
132 fflush(writer->file);
133 fclose(writer->file);