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