36 #ifndef DSPFILTERS_UTILITIES_H
37 #define DSPFILTERS_UTILITIES_H
55 void add (
int samples,
61 if (srcSkip !=0 || destSkip != 0)
65 while (--samples >= 0)
67 *dest =
static_cast<Td
>(*src);
74 while (--samples >= 0)
75 *dest++ +=
static_cast<Td
>(*src++);
80 template <
typename Td,
82 void add (
int channels,
87 for (
int i = channels; --i >= 0;)
88 add (samples, dest[i], src[i]);
95 template <
typename Td,
97 void copy (
int samples,
109 while (--samples >= 0)
119 while (--samples >= 0)
126 else if (destSkip != 0)
129 while (--samples >= 0)
137 while (--samples >= 0)
143 template <
typename Ty>
144 void copy (
int samples,
150 if (destSkip != 0 || srcSkip != 0)
151 copy<Ty,Ty> (samples, dest, src, destSkip, srcSkip);
153 ::memcpy (dest, src, samples *
sizeof(src[0]));
157 template <
typename Td,
159 void copy (
int channels,
162 Ts
const*
const* src,
166 for (
int i = channels; --i >= 0;)
167 copy (samples, dest[i], src[i], destSkip, srcSkip);
173 template <
typename Td,
typename Ts>
174 void deinterleave (
int channels,
179 assert (channels > 1);
187 int n = (samples + 7) / 8;
192 *l++ = *src++; *r++ = *src++;
193 case 7: *l++ = *src++; *r++ = *src++;
194 case 6: *l++ = *src++; *r++ = *src++;
195 case 5: *l++ = *src++; *r++ = *src++;
196 case 4: *l++ = *src++; *r++ = *src++;
197 case 3: *l++ = *src++; *r++ = *src++;
198 case 2: *l++ = *src++; *r++ = *src++;
199 case 1: *l++ = *src++; *r++ = *src++;
208 for (
int i = channels; --i >= 0;)
209 copy (samples, dest[i], src + i, 0, channels - 1);
216 template <
typename Td,
218 void deinterleave (
int samples,
226 deinterleave (2, samples, dest, src);
232 template <
typename Td,
235 void fade (
int samples,
242 Ty dt = (end - start) / samples;
244 while (--samples >= 0)
246 *dest++ =
static_cast<Td
>(*dest + t * (*src++ - *dest));
252 template <
typename Td,
255 void fade (
int channels,
258 Ts
const*
const* src,
262 for (
int i = channels; --i >= 0;)
263 fade (samples, dest[i], src[i], start, end);
271 template <
typename Td,
273 void interleave (
int channels,
276 Ts
const*
const* src)
287 const Ts* l = src[0];
288 const Ts* r = src[1];
291 int n = (samples + 7) / 8;
296 *dest++ = *l++; *dest++ = *r++;
297 case 7: *dest++ = *l++; *dest++ = *r++;
298 case 6: *dest++ = *l++; *dest++ = *r++;
299 case 5: *dest++ = *l++; *dest++ = *r++;
300 case 4: *dest++ = *l++; *dest++ = *r++;
301 case 3: *dest++ = *l++; *dest++ = *r++;
302 case 2: *dest++ = *l++; *dest++ = *r++;
303 case 1: *dest++ = *l++; *dest++ = *r++;
312 for (
int i = channels; --i >= 0;)
313 copy (samples, dest + i, src[i], channels - 1, 0);
322 template <
typename Td,
324 void interleave (
int samples,
332 interleave (2, samples, dest, src);
338 template <
typename Td,
340 void multiply (
int samples,
348 while (--samples >= 0)
350 *dest =
static_cast<Td
>(*dest * factor);
356 while (--samples >= 0)
357 *dest++ =
static_cast<Td
>(*dest * factor);
362 template <
typename Td,
364 void multiply (
int channels,
370 for (
int i = channels; --i >= 0;)
371 multiply (samples, dest[i], factor, destSkip);
378 template <
typename Td,
380 void reverse (
int samples,
386 src += (srcSkip + 1) * samples;
388 if (srcSkip != 0 || destSkip == 0)
392 while (--samples >= 0)
401 while (--samples >= 0)
406 template <
typename Td,
typename Ts>
407 void reverse (
int channels,
size_t frames, Td*
const* dest,
const Ts*
const* src)
409 for (
int i = channels; --i >= 0;)
410 reverse (frames, dest[i], src[i]);
415 template <
typename Tn>
416 void to_mono (
int samples, Tn* dest, Tn
const* left, Tn
const* right)
419 while (samples-- > 0)
420 *dest++ = (*left++ + *right++) * Tn(0.70710678118654752440084436210485);
422 while (samples-- > 0)
423 *dest++ = (*left++ + *right++) * Tn(0.5);
429 template <
typename T>
430 void validate (
int numChannels,
int numSamples, T
const*
const* src)
432 for (
int i = 0; i < numChannels; ++i)
434 T
const* p = src [i];
435 for (
int j = numSamples; j > 0; --j)
438 assert (v < 2 && v > -2);
452 template <
typename Ty,
456 static void process (
int samples,
463 while (--samples >= 0)
471 std::fill (dest, dest + samples, Ty());
476 template <
typename Ty>
477 struct zero<Ty, true>
479 static void process (
int samples,
484 zero<Ty,false>::process (samples, dest, destSkip);
486 ::memset (dest, 0, samples *
sizeof(dest[0]));
493 template <
typename Ty>
494 void zero (
int samples,
498 detail::zero<Ty, tr1::is_pod<Ty>::value>::process (samples, dest, destSkip );
503 template <
typename Ty>
504 void zero (
int samples,
511 while (--samples >= 0)
519 std::fill (dest, dest + samples, Ty());
526 template <
typename Ty>
527 void zero (
int channels,
532 for (
int i = channels; --i >= 0;)
533 zero (samples, dest[i], destSkip);
548 template <
class TFunction>
558 double d, e, m, p, q, r, tol, t2, u, v, w, fu, fv, fw, fx;
559 static const double c = 0.5*(3.0 - ::std::sqrt(5.0));
560 static const double SQRT_DBL_EPSILON = ::std::sqrt(DBL_EPSILON);
563 double& b = rightEnd;
566 v = w = x = a + c*(b - a);
573 tol = SQRT_DBL_EPSILON*::fabs(x) + epsilon;
576 if (::fabs(x - m) > t2 - 0.5*(b - a))
582 r = (x - w)*(fx - fv);
583 q = (x - v)*(fx - fw);
584 p = (x - v)*q - (x - w)*r;
586 (q > 0.0) ? p = -p : q = -q;
590 if (::fabs(p) < ::fabs(0.5*q*r) && p < q*(a - x) && p < q*(b - x))
596 if (u - a < t2 || b - u < t2)
597 d = (x < m) ? tol : -tol;
607 if (::fabs(d) >= tol)
617 (u < x) ? b = x : a = x;
627 (u < x) ? a = u : b = u;
628 if (fu <= fw || w == x)
635 else if (fu <= fv || v == x || v == w)
650 template <
int Channels=2,
typename Value=
float>
656 for (
int i = 0; i < Channels; i++)
660 Value operator[] (
int channel)
const
662 return m_env[channel];
665 void Setup (
int sampleRate,
double attackMs,
double releaseMs)
667 m_a = pow (0.01, 1.0 / (attackMs * sampleRate * 0.001));
668 m_r = pow (0.01, 1.0 / (releaseMs * sampleRate * 0.001));
671 void Process (
size_t samples,
const Value** src)
673 for(
int i=0; i<Channels; i++ )
675 const Value* cur = src[i];
678 for (
int n = samples; n; n--)
680 double v = ::fabs(*cur++);
682 e = m_a * (e - v) + v;
684 e = m_r * (e - v) + v;
690 double m_env[Channels];