summaryrefslogtreecommitdiff
path: root/input/sndio.c
blob: 5d13784480195c11b06400f591a66aa0b8fb941a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "input/sndio.h"
#include "input/common.h"

#include <sndio.h>

void *input_sndio(void *data) {
    struct audio_data *audio = (struct audio_data *)data;
    struct sio_par par;
    struct sio_hdl *hdl;
    int16_t buf[256];
    unsigned int channels;

    sio_initpar(&par);
    par.sig = 1;
    par.bits = 16;
    par.le = 1;
    par.rate = 44100;
    par.rchan = 2;
    par.appbufsz = sizeof(buf) / par.rchan;

    if ((hdl = sio_open(audio->source, SIO_REC, 0)) == NULL) {
        fprintf(stderr, __FILE__ ": Could not open sndio source: %s\n", audio->source);
        exit(EXIT_FAILURE);
    }

    if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par) || par.sig != 1 || par.le != 1 ||
        par.rate != 44100 || par.rchan != audio->channels) {
        fprintf(stderr, __FILE__ ": Could not set required audio parameters\n");
        exit(EXIT_FAILURE);
    }

    if (!sio_start(hdl)) {
        fprintf(stderr, __FILE__ ": sio_start() failed\n");
        exit(EXIT_FAILURE);
    }

    uint16_t frames = (sizeof(buf) / sizeof(buf[0])) / channels;
    while (audio->terminate != 1) {
        if (sio_read(hdl, buf, sizeof(buf)) == 0) {
            fprintf(stderr, __FILE__ ": sio_read() failed: %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }

        write_to_fftw_input_buffers(buf, frames, audio);
        /*
                        for (i = 0; i < sizeof(buf)/sizeof(buf[0]); i += 2) {
                                if (par.rchan == 1) {
                                        // sndiod has already taken care of averaging the samples
                                        audio->audio_out_l[n] = buf[i];
                                } else if (par.rchan == 2) {
                                        audio->audio_out_l[n] = buf[i];
                                        audio->audio_out_r[n] = buf[i + 1];
                                }
                                n = (n + 1) % audio->FFTbufferSize;
                        }
        */
    }

    sio_stop(hdl);
    sio_close(hdl);

    return 0;
}