diff options
author | Hans Baier <hansfbaier@googlemail.com> | 2009-06-10 00:03:47 +0000 |
---|---|---|
committer | Hans Baier <hansfbaier@googlemail.com> | 2009-06-10 00:03:47 +0000 |
commit | 43340cd37ce91752f80b776d905e1b0d103c89ef (patch) | |
tree | a4aa17688238e96d686ba7435e88eccfa4000ff9 /libs/ardour/ardour/interpolation.h | |
parent | f284d28d5306114e9badc9077835683e541420e0 (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.h | 53 |
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 |