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