add default MSYS filenames for libraries.
[sox/ew.git] / src / dither.h
blob979c5064b5e8089e45cfaad99b77e1c9e0f25faa
1 #ifdef IIR
2 #define _ output += p->coefs[j] * p->previous_errors[p->pos + j] \
3 - p->coefs[N + j] * p->previous_outputs[p->pos + j], ++j;
4 #else
5 #define _ d -= p->coefs[j] * p->previous_errors[p->pos + j], ++j;
6 #endif
7 static int NAME(sox_effect_t * effp, const sox_sample_t * ibuf,
8 sox_sample_t * obuf, size_t * isamp, size_t * osamp)
10 priv_t * p = (priv_t *)effp->priv;
11 size_t len = *isamp = *osamp = min(*isamp, *osamp);
13 while (len--) {
14 if (!p->auto_detect || (p->history = ((p->history << 1) + !!(*ibuf & (((unsigned)-1) >> p->prec))))) {
15 int32_t r1 = RANQD1 >> p->prec, r2 = RANQD1 >> p->prec; /* Defer add! */
16 #ifdef IIR
17 double d1, d, output = 0;
18 #else
19 double d1, d = *ibuf++;
20 #endif
21 int i, j = 0;
22 CONVOLVE
23 assert(j == N);
24 p->pos = p->pos? p->pos - 1 : p->pos - 1 + N;
25 #ifdef IIR
26 d = *ibuf++ - output;
27 p->previous_outputs[p->pos + N] = p->previous_outputs[p->pos] = output;
28 #endif
29 d1 = (d + r1 + r2) / (1 << (32 - p->prec));
30 i = d1 < 0? d1 - .5 : d1 + .5;
31 p->previous_errors[p->pos + N] = p->previous_errors[p->pos] =
32 (double)i * (1 << (32 - p->prec)) - d;
33 if (i < (-1 << (p->prec-1)))
34 ++effp->clips, *obuf = SOX_SAMPLE_MIN;
35 else if (i > (int)SOX_INT_MAX(p->prec))
36 ++effp->clips, *obuf = SOX_INT_MAX(p->prec) << (32 - p->prec);
37 else *obuf = i << (32 - p->prec);
38 ++obuf;
40 if (p->dither_off)
41 lsx_debug("flow %u: on @ %u", (unsigned)effp->flow, (unsigned)p->num_output);
42 p->dither_off = sox_false;
44 else {
45 *obuf++ = *ibuf++;
46 if (!p->dither_off) {
47 lsx_debug("flow %u: off @ %u", (unsigned)effp->flow, (unsigned)p->num_output);
48 memset(p->previous_errors, 0, sizeof(p->previous_errors));
49 memset(p->previous_outputs, 0, sizeof(p->previous_outputs));
51 p->dither_off = sox_true;
53 ++p->num_output;
55 return SOX_SUCCESS;
57 #undef CONVOLVE
58 #undef _
59 #undef NAME
60 #undef N