Remove all use of nframes_t.
[ardour.git] / libs / ardour / ardour / interpolation.h
1 #include <math.h>
2 #include <samplerate.h>
3
4 #include "ardour/types.h"
5
6 #ifndef __interpolation_h__
7 #define __interpolation_h__
8
9 namespace ARDOUR {
10
11 class Interpolation {
12  protected:
13      double   _speed, _target_speed;
14
15      // the idea is that when the speed is not 1.0, we have to
16      // interpolate between samples and then we have to store where we thought we were.
17      // rather than being at sample N or N+1, we were at N+0.8792922
18      std::vector<double> phase;
19
20
21  public:
22      Interpolation ()  { _speed = 1.0; _target_speed = 1.0; }
23      ~Interpolation () { phase.clear(); }
24
25      void set_speed (double new_speed)          { _speed = new_speed; _target_speed = new_speed; }
26      void set_target_speed (double new_speed)   { _target_speed = new_speed; }
27
28      double target_speed()          const { return _target_speed; }
29      double speed()                 const { return _speed; }
30
31      void add_channel_to (int /*input_buffer_size*/, int /*output_buffer_size*/) { phase.push_back (0.0); }
32      void remove_channel_from () { phase.pop_back (); }
33
34      void reset () {
35          for (size_t i = 0; i < phase.size(); i++) {
36               phase[i] = 0.0;
37           }
38      }
39 };
40
41 class LinearInterpolation : public Interpolation {
42 public:
43         framecnt_t interpolate (int channel, framecnt_t nframes, Sample* input, Sample* output);
44 };
45
46 class CubicInterpolation : public Interpolation {
47 public:
48         framecnt_t interpolate (int channel, framecnt_t nframes, Sample* input, Sample* output);
49 };
50
51 } // namespace ARDOUR
52
53 #endif