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
|