Fix some more warnings.
[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  protected:
43     
44  public:
45      nframes_t interpolate (int channel, nframes_t nframes, Sample* input, Sample* output);
46 };
47
48 class CubicInterpolation : public Interpolation {
49  protected:
50     // shamelessly ripped from Steve Harris' swh-plugins (ladspa-util.h)
51     static inline float cube_interp(const float fr, const float inm1, const float
52                                     in, const float inp1, const float inp2)
53     {
54         return in + 0.5f * fr * (inp1 - inm1 +
55          fr * (4.0f * inp1 + 2.0f * inm1 - 5.0f * in - inp2 +
56          fr * (3.0f * (in - inp1) - inm1 + inp2)));
57     }
58     
59  public:
60      nframes_t interpolate (int channel, nframes_t nframes, Sample* input, Sample* output);
61 };
62  
63 } // namespace ARDOUR
64
65 #endif