1 #include <stdlib.h>
2 #include "soundpipe.h"
3 #include "dr_wav.h"
4
5 #define WAVOUT_BUFSIZE 1024
6
7 struct sp_wavout {
8 drwav *wav;
9 drwav_data_format format;
10 SPFLOAT buf[WAVOUT_BUFSIZE];
11 int count;
12 };
13
sp_wavout_create(sp_wavout ** p)14 int sp_wavout_create(sp_wavout **p)
15 {
16 *p = malloc(sizeof(sp_wavout));
17 return SP_OK;
18 }
19
sp_wavout_destroy(sp_wavout ** p)20 int sp_wavout_destroy(sp_wavout **p)
21 {
22 /* write any remaining samples */
23 if((*p)->count != 0) {
24 drwav_write((*p)->wav, (*p)->count, (*p)->buf);
25 }
26 drwav_close((*p)->wav);
27 free(*p);
28 return SP_OK;
29 }
30
sp_wavout_init(sp_data * sp,sp_wavout * p,const char * filename)31 int sp_wavout_init(sp_data *sp, sp_wavout *p, const char *filename)
32 {
33 p->count = 0;
34 p->format.container = drwav_container_riff;
35 p->format.format = DR_WAVE_FORMAT_IEEE_FLOAT;
36 p->format.channels = 1;
37 p->format.sampleRate = sp->sr;
38 p->format.bitsPerSample = 32;
39 p->wav = drwav_open_file_write(filename, &p->format);
40 return SP_OK;
41 }
42
sp_wavout_compute(sp_data * sp,sp_wavout * p,SPFLOAT * in,SPFLOAT * out)43 int sp_wavout_compute(sp_data *sp, sp_wavout *p, SPFLOAT *in, SPFLOAT *out)
44 {
45 *out = *in;
46 if(p->count == WAVOUT_BUFSIZE) {
47 drwav_write(p->wav, WAVOUT_BUFSIZE, p->buf);
48 p->count = 0;
49 }
50 p->buf[p->count] = *in;
51 p->count++;
52 return SP_OK;
53 }
54