summaryrefslogtreecommitdiffstats
path: root/main.c
blob: 5356f47ea008892c74552aa4a1f6285c83d67aae (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
#include <unistd.h>
#include <inttypes.h>
#include <assert.h>

#include "v17mod.h"
#include "v17tcm.h"
#include "util.h"

int16_t *conv_float_16sle(float *p, int l) {
    int i;
    int16_t *r = (int16_t*) p, *target = (int16_t*) p;

    assert(2*sizeof(int16_t) == sizeof(float));

    for (i = 0; i < l; i++) {
        int v = (int) (0x3FFF * *p);

        if (v < -0x8000) {
            v = -0x8000;
            fprintf(stderr, "UNDERFLOW: %f\n", *p);
        }

        if (v > 0x7fff) {
            v = 0x7fff;
            fprintf(stderr, "OVERFLOW\n");
        }
                        
        
        *(target++) = (int16_t) v;
        *(target++) = (int16_t) v;

        p++;
    }

    return r;
}

#ifndef TEST

int main() {
    struct v17mod_state mod;
    struct v17tcm_state tcm;

    v17mod_init(&mod);
    v17tcm_init(&tcm);

    for (;;) {
        ssize_t l;
        uint8_t buf[64];
        int i, n;
        float f[1024];

        //fprintf(stderr, "ITERATE\n");
        
        if ((l = read(0, buf, sizeof(buf))) <= 0) {
            //if (l < 0)
                fprintf(stderr, "read failure\n");

            
            goto finish;
        }

        for (i = 0; i < l; i++)
            buf[i] = v17tcm_encode(&tcm, buf[i] & 7);

        v17mod_push(&mod, buf, l);

        n = v17mod_pull(&mod, f, sizeof(f)/sizeof(float));

        
        
        if (loop_write(1, conv_float_16sle(f, n), n*sizeof(int16_t)*2) < 0) {
            fprintf(stderr, "write failure\n");
            goto finish;
        }
    }
    

finish:

    v17mod_done(&mod);
    
    return 0;
}

#endif