40 if (!filepath || sample_rate <= 0 || channels <= 0 || channels > 2) {
49 writer->
file = fopen(filepath,
"wb");
62 .wave = {
'W',
'A',
'V',
'E'}};
68 .sample_rate = (
uint32_t)sample_rate,
69 .byte_rate = (
uint32_t)(sample_rate * channels *
sizeof(
float)),
70 .block_align = (
uint16_t)(channels *
sizeof(float)),
71 .bits_per_sample = 32};
74 .
data = {
'd',
'a',
't',
'a'},
78 fwrite(&riff,
sizeof(riff), 1, writer->
file);
79 fwrite(&fmt,
sizeof(fmt), 1, writer->
file);
80 fwrite(&data,
sizeof(data), 1, writer->
file);
86 if (!writer || !writer->
file || !samples || num_samples <= 0) {
90 size_t written = fwrite(samples,
sizeof(
float), num_samples, writer->
file);
91 if (written != (
size_t)num_samples) {
107 uint32_t file_size = data_size + 36;
110 fseek(writer->
file, 4, SEEK_SET);
114 fseek(writer->
file, 40, SEEK_SET);
117 fclose(writer->
file);
124 const char *env =
SAFE_GETENV(
"ASCIICHAT_DUMP_AUDIO");
125 return env && (strcmp(env,
"1") == 0 || strcmp(env,
"true") == 0);
#define SAFE_MALLOC(size, cast)
#define SAFE_GETENV(name)
🔤 String Manipulation and Shell Escaping Utilities
bool wav_dump_enabled(void)
Check if audio dumping is enabled via environment.
wav_writer_t * wav_writer_open(const char *filepath, int sample_rate, int channels)
Open WAV file for writing.
int wav_writer_write(wav_writer_t *writer, const float *samples, int num_samples)
Write audio samples to WAV file.
void wav_writer_close(wav_writer_t *writer)
Close WAV file and finalize header.
Simple WAV file writer for audio debugging.