-double sinc(double x)
-{
- if (fabs(x) < 1e-6) {
- return 1.0f - fabs(x);
- } else {
- return sin(x) / x;
- }
-}
-
-#if 0
-double weight(double x)
-{
- if (fabs(x) > LANCZOS_RADIUS) {
- return 0.0f;
- }
- return sinc(M_PI * x) * sinc(M_PI * x / LANCZOS_RADIUS);
-}
-
-double interpolate(const std::vector<double_stereo_sample> &pcm, double i)
-{
- int lower = std::max<int>(ceil(i - LANCZOS_RADIUS), 0);
- int upper = std::min<int>(floor(i + LANCZOS_RADIUS), pcm.size() - 1);
- double sum = 0.0f;
-
- for (int x = lower; x <= upper; ++x) {
- sum += pcm[x].right * weight(i - x);
- }
- return sum;
-}
-#else
-double weight(double x)
-{
- if (fabs(x) > 1.0f) {
- return 0.0f;
- }
- return 1.0f - fabs(x);
-}
-
-inline double interpolate(const std::vector<double> &pcm, double i)
-{
- int ii = int(i);
- if (ii < 0 || ii >= int(pcm.size() - 1)) {
- return 0.0;
- }
- double frac = i - ii;
-
- return pcm[ii] + frac * (pcm[ii + 1] - pcm[ii]);
-}
-
-template<class T>
-inline double interpolate(const std::vector<T> &pcm, double i)
-{
- int ii = int(i);
- if (ii < 0 || ii >= int(pcm.size() - 1)) {
- return 0.0;
- }
- double frac = i - ii;
-
- return pcm[ii].right + frac * (pcm[ii + 1].right - pcm[ii].right);
-}
-#endif
-