1 #include "input/sndio.h"
2 #include "input/common.h"
3 
4 #include <sndio.h>
5 
input_sndio(void * data)6 void *input_sndio(void *data) {
7     struct audio_data *audio = (struct audio_data *)data;
8     struct sio_par par;
9     struct sio_hdl *hdl;
10     int16_t buf[audio->FFTtreblebufferSize * 2];
11 
12     sio_initpar(&par);
13     par.sig = 1;
14     par.bits = 16;
15     par.le = 1;
16     par.rate = 44100;
17     par.rchan = audio->channels;
18     par.appbufsz = sizeof(buf) / par.rchan;
19 
20     if ((hdl = sio_open(audio->source, SIO_REC, 0)) == NULL) {
21         fprintf(stderr, __FILE__ ": Could not open sndio source: %s\n", audio->source);
22         exit(EXIT_FAILURE);
23     }
24 
25     if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par) || par.sig != 1 || par.le != 1 ||
26         par.rate != 44100 || par.rchan != audio->channels) {
27         fprintf(stderr, __FILE__ ": Could not set required audio parameters\n");
28         exit(EXIT_FAILURE);
29     }
30 
31     if (!sio_start(hdl)) {
32         fprintf(stderr, __FILE__ ": sio_start() failed\n");
33         exit(EXIT_FAILURE);
34     }
35 
36     uint16_t frames = (sizeof(buf) / sizeof(buf[0])) / audio->channels;
37     while (audio->terminate != 1) {
38         if (sio_read(hdl, buf, sizeof(buf)) == 0) {
39             fprintf(stderr, __FILE__ ": sio_read() failed: %s\n", strerror(errno));
40             exit(EXIT_FAILURE);
41         }
42 
43         pthread_mutex_lock(&lock);
44         write_to_fftw_input_buffers(frames, buf, audio);
45         pthread_mutex_unlock(&lock);
46     }
47 
48     sio_stop(hdl);
49     sio_close(hdl);
50 
51     return 0;
52 }
53