summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/interpolation.h
diff options
context:
space:
mode:
authorHans Baier <hansfbaier@googlemail.com>2009-06-10 00:03:28 +0000
committerHans Baier <hansfbaier@googlemail.com>2009-06-10 00:03:28 +0000
commitf284d28d5306114e9badc9077835683e541420e0 (patch)
tree500bbe83900479c1a0780e780242187cd51bc9ef /libs/ardour/ardour/interpolation.h
parentd039e2e80ff2179aef7430c53ca41e43297d9065 (diff)
libardour: * Add basic classes for later support of multiple interpolation algorithms for varispeed
* Add unit tests: Test which shows how the varispeed implementation in diskstream is broken. git-svn-id: svn://localhost/ardour2/branches/3.0@5144 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/ardour/interpolation.h')
-rw-r--r--libs/ardour/ardour/interpolation.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/libs/ardour/ardour/interpolation.h b/libs/ardour/ardour/interpolation.h
new file mode 100644
index 0000000000..09ae242490
--- /dev/null
+++ b/libs/ardour/ardour/interpolation.h
@@ -0,0 +1,49 @@
+#include <math.h>
+//#include "ardour/types.h"
+
+typedef float Sample;
+#define nframes_t uint32_t
+
+// 40.24 fixpoint math
+#define FIXPOINT_ONE 0x1000000
+
+class Interpolation {
+ protected:
+ /// speed in fixed point math
+ uint64_t phi;
+
+ /// target speed in fixed point math
+ uint64_t target_phi;
+
+ uint64_t last_phase;
+
+ // 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; }
+
+ virtual nframes_t interpolate (nframes_t nframes, Sample* input, Sample* output) = 0;
+};
+
+class LinearInterpolation : public Interpolation {
+ public:
+ nframes_t interpolate (nframes_t nframes, Sample* input, Sample* output);
+};