summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/interpolation.h
diff options
context:
space:
mode:
authorHans Baier <hansfbaier@googlemail.com>2009-06-10 00:03:47 +0000
committerHans Baier <hansfbaier@googlemail.com>2009-06-10 00:03:47 +0000
commit43340cd37ce91752f80b776d905e1b0d103c89ef (patch)
treea4aa17688238e96d686ba7435e88eccfa4000ff9 /libs/ardour/ardour/interpolation.h
parentf284d28d5306114e9badc9077835683e541420e0 (diff)
* Refactor varispeed playback into own class, replace fixed-point arithmetic by double, fix unit tests for libardour
git-svn-id: svn://localhost/ardour2/branches/3.0@5145 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/ardour/interpolation.h')
-rw-r--r--libs/ardour/ardour/interpolation.h53
1 files changed, 18 insertions, 35 deletions
diff --git a/libs/ardour/ardour/interpolation.h b/libs/ardour/ardour/interpolation.h
index 09ae242490..06c7ddebe0 100644
--- a/libs/ardour/ardour/interpolation.h
+++ b/libs/ardour/ardour/interpolation.h
@@ -1,49 +1,32 @@
#include <math.h>
-//#include "ardour/types.h"
+#include "ardour/types.h"
-typedef float Sample;
-#define nframes_t uint32_t
+#ifndef __interpolation_h__
+#define __interpolation_h__
-// 40.24 fixpoint math
-#define FIXPOINT_ONE 0x1000000
+namespace ARDOUR {
class Interpolation {
- protected:
- /// speed in fixed point math
- uint64_t phi;
+protected:
+ double _speed, _target_speed;
+
+public:
+ Interpolation () : _speed(0.0L) {}
- /// target speed in fixed point math
- uint64_t target_phi;
-
- uint64_t last_phase;
+ void set_speed (double new_speed) { _speed = new_speed; }
+ void set_target_speed (double new_speed) { _target_speed = new_speed; }
- // Fixed point is just an integer with an implied scaling factor.
- // In 40.24 the scaling factor is 2^24 = 16777216,
- // so a value of 10*2^24 (in integer space) is equivalent to 10.0.
- //
- // The advantage is that addition and modulus [like x = (x + y) % 2^40]
- // have no rounding errors and no drift, and just require a single integer add.
- // (swh)
-
- static const int64_t fractional_part_mask = 0xFFFFFF;
- static const Sample binary_scaling_factor = 16777216.0f;
-
- public:
- Interpolation () : phi (FIXPOINT_ONE), target_phi (FIXPOINT_ONE), last_phase (0) {}
-
- void set_speed (double new_speed) {
- target_phi = (uint64_t) (FIXPOINT_ONE * fabs(new_speed));
- phi = target_phi;
- }
-
- uint64_t get_phi () const { return phi; }
- uint64_t get_target_phi () const { return target_phi; }
- uint64_t get_last_phase () const { return last_phase; }
+ double target_speed() const { return _target_speed; }
+ double speed() const { return _speed; }
virtual nframes_t interpolate (nframes_t nframes, Sample* input, Sample* output) = 0;
};
class LinearInterpolation : public Interpolation {
- public:
+public:
nframes_t interpolate (nframes_t nframes, Sample* input, Sample* output);
};
+
+} // namespace ARDOUR
+
+#endif \ No newline at end of file