DWORD FilteredWave::Sample(TimeValue t0,TimeValue t1,int channel) { if (!sat || channel>=channels) return 0; int s,e,den; if (end<=start) return 0; if (t1-t0 > end-start) { t0 = start; t1 = end; } if (t0<start) { int d = (end-start) * ((start-t0)/(end-start) + 1); t0 += d; t1 += d; } t0 = t0 % (end-start); t1 = t1 % (end-start); if (t1<t0) t1 = end-1; //s = ((t0-start) * satLen)/(end-start); //e = ((t1-start) * satLen)/(end-start); s = MulDiv32((t0-start), satLen, (end-start)); e = MulDiv32((t1-start), satLen, (end-start)); if (s==e) { if (e) s = e-1; else e = s+1; if (s<0 || e>=(int)satLen) return 0; } assert(s>=0); assert(e<(int)satLen); den = numSum * (e-s); if (!den) return 0; else return (sat[e*channels+channel]-sat[s*channels+channel])/den; }
SIMD_INLINE __m128i MulDiv16(__m128i dividend, __m128i divisor, const __m128 & KF_255_DIV_6) { const __m128i quotientLo = MulDiv32(_mm_unpacklo_epi16(dividend, K_ZERO), _mm_unpacklo_epi16(divisor, K_ZERO), KF_255_DIV_6); const __m128i quotientHi = MulDiv32(_mm_unpackhi_epi16(dividend, K_ZERO), _mm_unpackhi_epi16(divisor, K_ZERO), KF_255_DIV_6); return _mm_packs_epi32(quotientLo, quotientHi); }