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: void NAME (void *opaque, st_sample_t *ibuf, st_sample_t *obuf,
31: int *isamp, int *osamp)
32: {
33: struct rate *rate = opaque;
34: st_sample_t *istart, *iend;
35: st_sample_t *ostart, *oend;
36: st_sample_t ilast, icur, out;
37: #ifdef FLOAT_MIXENG
38: real_t t;
39: #else
40: int64_t t;
41: #endif
42:
43: ilast = rate->ilast;
44:
45: istart = ibuf;
46: iend = ibuf + *isamp;
47:
48: ostart = obuf;
49: oend = obuf + *osamp;
50:
51: if (rate->opos_inc == (1ULL + UINT_MAX)) {
52: int i, n = *isamp > *osamp ? *osamp : *isamp;
53: for (i = 0; i < n; i++) {
54: OP (obuf[i].l, ibuf[i].l);
55: OP (obuf[i].r, ibuf[i].r);
56: }
57: *isamp = n;
58: *osamp = n;
59: return;
60: }
61:
62: while (obuf < oend) {
63:
64:
65: if (ibuf >= iend) {
66: break;
67: }
68:
69:
70:
71: while (rate->ipos <= (rate->opos >> 32)) {
72: ilast = *ibuf++;
73: rate->ipos++;
74:
75: if (ibuf >= iend) {
76: goto the_end;
77: }
78: }
79:
80: icur = *ibuf;
81:
82:
83: #ifdef FLOAT_MIXENG
84: #ifdef RECIPROCAL
85: t = (rate->opos & UINT_MAX) * (1.f / UINT_MAX);
86: #else
87: t = (rate->opos & UINT_MAX) / (real_t) UINT_MAX;
88: #endif
89: out.l = (ilast.l * (1.0 - t)) + icur.l * t;
90: out.r = (ilast.r * (1.0 - t)) + icur.r * t;
91: #else
92: t = rate->opos & 0xffffffff;
93: out.l = (ilast.l * ((int64_t) UINT_MAX - t) + icur.l * t) >> 32;
94: out.r = (ilast.r * ((int64_t) UINT_MAX - t) + icur.r * t) >> 32;
95: #endif
96:
97:
98: OP (obuf->l, out.l);
99: OP (obuf->r, out.r);
100: obuf += 1;
101: rate->opos += rate->opos_inc;
102: }
103:
104: the_end:
105: *isamp = ibuf - istart;
106: *osamp = obuf - ostart;
107: rate->ilast = ilast;
108: }
109:
110: #undef NAME
111: #undef OP