2 #define _ output += p->coefs[j] * p->previous_errors[p->pos + j] \
3 - p->coefs[N + j] * p->previous_outputs[p->pos + j], ++j;
5 #define _ d -= p->coefs[j] * p->previous_errors[p->pos + j], ++j;
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
);
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! */
17 double d1
, d
, output
= 0;
19 double d1
, d
= *ibuf
++;
24 p
->pos
= p
->pos
? p
->pos
- 1 : p
->pos
- 1 + N
;
27 p
->previous_outputs
[p
->pos
+ N
] = p
->previous_outputs
[p
->pos
] = output
;
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
);
41 lsx_debug("flow %u: on @ %u", (unsigned)effp
->flow
, (unsigned)p
->num_output
);
42 p
->dither_off
= sox_false
;
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
;