From 26410407010e64dd6c00ffa17fc6bcdb7cf5168e Mon Sep 17 00:00:00 2001 From: Hans Baier Date: Tue, 23 Jun 2009 14:53:37 +0000 Subject: interpolation.h / audio_diskstream.cc: make varispeed sound well again, by replacing the code by the original implementation for later comparison and step-by-step refactoring git-svn-id: svn://localhost/ardour2/branches/3.0@5260 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/interpolation.h | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'libs/ardour/ardour/interpolation.h') diff --git a/libs/ardour/ardour/interpolation.h b/libs/ardour/ardour/interpolation.h index a2945ffc2b..e398171d2b 100644 --- a/libs/ardour/ardour/interpolation.h +++ b/libs/ardour/ardour/interpolation.h @@ -40,25 +40,31 @@ class FixedPointLinearInterpolation : public Interpolation { std::vector 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; + // 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: - FixedPointLinearInterpolation () : phi (FIXPOINT_ONE), target_phi (FIXPOINT_ONE) {} + + FixedPointLinearInterpolation () : phi (FIXPOINT_ONE), target_phi (FIXPOINT_ONE) {} void set_speed (double new_speed) { target_phi = (uint64_t) (FIXPOINT_ONE * fabs(new_speed)); phi = target_phi; } + uint64_t get_phi() { return phi; } + uint64_t get_target_phi() { return target_phi; } + uint64_t get_last_phase() { assert(last_phase.size()); return last_phase[0]; } + void set_last_phase(uint64_t phase) { assert(last_phase.size()); last_phase[0] = phase; } + void add_channel_to (int input_buffer_size, int output_buffer_size); void remove_channel_from (); -- cgit v1.2.3