#include <ardour/ardour.h>
#include <ardour/configuration.h>
-#include <ardour/session.h>
-#include <ardour/route_group.h>
-#include <ardour/route.h>
-#include <ardour/port.h>
#include <ardour/utils.h>
#include <ardour/diskstream.h>
#include <ardour/audioplaylist.h>
+#include <ardour/port.h>
struct tm;
XMLNode* deprecated_io_node;
+ /**
+ * Calculate the playback distance during varispeed playback.
+ * Important for Session::process to know exactly, how many frames
+ * were passed by.
+ */
+ static nframes_t calculate_varispeed_playback_distance(
+ nframes_t nframes,
+ uint64_t& the_last_phase,
+ uint64_t& the_phi,
+ uint64_t& the_target_phi)
+ {
+ // calculate playback distance in the same way
+ // as in AudioDiskstream::process_varispeed_playback
+ uint64_t phase = the_last_phase;
+ int64_t phi_delta;
+ nframes_t i = 0;
+
+ const int64_t fractional_part_mask = 0xFFFFFF;
+ const Sample binary_scaling_factor = 16777216.0f;
+
+ if (the_phi != the_target_phi) {
+ phi_delta = ((int64_t)(the_target_phi - the_phi)) / nframes;
+ } else {
+ phi_delta = 0;
+ }
+
+ Sample fractional_phase_part;
+
+ i = 0;
+ phase = the_last_phase;
+
+ for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
+ i = phase >> 24;
+ fractional_phase_part = (phase & fractional_part_mask) / binary_scaling_factor;
+ phase += the_phi + phi_delta;
+ }
+
+ the_last_phase = (phase & fractional_part_mask);
+ the_phi = the_target_phi;
+ return i; // + 1;
+ }
+
protected:
friend class Session;
int rename_write_sources ();
void reset_write_sources (bool, bool force = false);
void non_realtime_input_change ();
+ void non_realtime_locate (nframes_t location);
protected:
friend class Auditioner;
boost::shared_ptr<AudioFileSource> fades_source;
boost::shared_ptr<AudioFileSource> write_source;
-
+
+ /// the Port that our audio data comes from
Port *source;
Sample *current_capture_buffer;
Sample *current_playback_buffer;
typedef std::vector<ChannelInfo*> ChannelList;
+ void process_varispeed_playback(nframes_t nframes, boost::shared_ptr<ChannelList> c);
+
/* The two central butler operations */
- int do_flush (Session::RunContext context, bool force = false);
+ int do_flush (RunContext context, bool force = false);
int do_refill () { return _do_refill(_mixdown_buffer, _gain_buffer); }
int do_refill_with_alloc ();
nframes_t& start, nframes_t cnt,
ChannelInfo* channel_info, int channel, bool reversed);
+
void finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList>);
void transport_stopped (struct tm&, time_t, bool abort);
+ void transport_looped (nframes_t transport_frame);
void init (Diskstream::Flag);