template static int interpolate (float* lastInputSamples, double& subSamplePos, const double actualRatio, const float* in, float* out, const int numOut) noexcept { if (actualRatio == 1.0 && subSamplePos == 1.0) { memcpy (out, in, (size_t) numOut * sizeof (float)); pushInterpolationSamples (lastInputSamples, in, numOut); return numOut; } const float* const originalIn = in; double pos = subSamplePos; if (actualRatio <= 1.0) { for (int i = numOut; --i >= 0;) { if (pos >= 1.0) { pushInterpolationSample (lastInputSamples, *in++); pos -= 1.0; } *out++ = InterpolatorType::valueAtOffset (lastInputSamples, (float) pos); pos += actualRatio; } } else { for (int i = numOut; --i >= 0;) { while (pos >= 1.0) { pushInterpolationSample(lastInputSamples, *in++); pos -= 1.0; } *out++ = InterpolatorType::valueAtOffset(lastInputSamples, (float)pos); pos += actualRatio; } } subSamplePos = pos; return (int) (in - originalIn); }