#include "wav.h" #include "channel.h" #include #include #include int wav_read(const char *path, float **buffer, unsigned *frames) { SF_INFO info; info.format = 0; SNDFILE *sf = sf_open(path, SFM_READ, &info); if (!sf) return -1; /* We need mono 16-bit PCM; refuse anything else */ if (info.channels != 1 || info.samplerate <= 0) { sf_close(sf); return -1; } unsigned total = (info.frames > (sf_count_t)LOOP_BUF_SIZE) ? LOOP_BUF_SIZE : (unsigned)info.frames; float *buf = (float*)malloc(total * sizeof(float)); if (!buf) { sf_close(sf); return -1; } sf_count_t nread = sf_readf_float(sf, buf, total); sf_close(sf); *buffer = buf; *frames = (unsigned)nread; return 0; } int wav_write(const char *path, const float *data, unsigned frames, unsigned sample_rate) { SF_INFO info; info.samplerate = sample_rate; info.channels = 1; info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; SNDFILE *sf = sf_open(path, SFM_WRITE, &info); if (!sf) return -1; sf_writef_float(sf, data, frames); sf_close(sf); return 0; }