diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index d6f3b739e9..e135d1319b 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -131,7 +131,7 @@ class Diskstream : public SessionObject, public boost::noncopyable /* Stateful */ virtual XMLNode& get_state(void) = 0; virtual int set_state(const XMLNode&, int version) = 0; - + virtual void monitor_input (bool) {} nframes_t capture_offset() const { return _capture_offset; } @@ -246,6 +246,9 @@ class Diskstream : public SessionObject, public boost::noncopyable virtual void setup_destructive_playlist () {} virtual void use_destructive_playlist () {} + void calculate_record_range(OverlapType ot, sframes_t transport_frame, nframes_t nframes, + nframes_t& rec_nframes, nframes_t& rec_offset); + static nframes_t disk_io_chunk_frames; std::vector capture_info; Glib::Mutex capture_info_lock; diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index 4f631c50cb..599e5ea1f9 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -470,54 +470,14 @@ AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can } if (nominally_recording || (_session.get_record_enabled() && _session.config.get_punch_in())) { - OverlapType ot; - // Safeguard against situations where process() goes haywire when autopunching and last_recordable_frame < first_recordable_frame if (last_recordable_frame < first_recordable_frame) { last_recordable_frame = max_frames; } - ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes); + OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes); - switch (ot) { - case OverlapNone: - rec_nframes = 0; - break; - - case OverlapInternal: - /* ---------- recrange - |---| transrange - */ - rec_nframes = nframes; - rec_offset = 0; - break; - - case OverlapStart: - /* |--------| recrange - -----| transrange - */ - rec_nframes = transport_frame + nframes - first_recordable_frame; - if (rec_nframes) { - rec_offset = first_recordable_frame - transport_frame; - } - break; - - case OverlapEnd: - /* |--------| recrange - |-------- transrange - */ - rec_nframes = last_recordable_frame - transport_frame; - rec_offset = 0; - break; - - case OverlapExternal: - /* |--------| recrange - -------------- transrange - */ - rec_nframes = last_recordable_frame - first_recordable_frame; - rec_offset = first_recordable_frame - transport_frame; - break; - } + calculate_record_range(ot, transport_frame, nframes, rec_nframes, rec_offset); if (rec_nframes && !was_recording) { capture_captured = 0; diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 0b4c98eaa3..aaeb15a995 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -594,3 +594,48 @@ Diskstream::route_going_away () { _io.reset (); } + +void +Diskstream::calculate_record_range(OverlapType ot, sframes_t transport_frame, nframes_t nframes, + nframes_t& rec_nframes, nframes_t& rec_offset) +{ + switch (ot) { + case OverlapNone: + rec_nframes = 0; + break; + + case OverlapInternal: + /* ---------- recrange + |---| transrange + */ + rec_nframes = nframes; + rec_offset = 0; + break; + + case OverlapStart: + /* |--------| recrange + -----| transrange + */ + rec_nframes = transport_frame + nframes - first_recordable_frame; + if (rec_nframes) { + rec_offset = first_recordable_frame - transport_frame; + } + break; + + case OverlapEnd: + /* |--------| recrange + |-------- transrange + */ + rec_nframes = last_recordable_frame - transport_frame; + rec_offset = 0; + break; + + case OverlapExternal: + /* |--------| recrange + -------------- transrange + */ + rec_nframes = last_recordable_frame - first_recordable_frame; + rec_offset = first_recordable_frame - transport_frame; + break; + } +} diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 8172bd9d66..12d39426d8 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -528,49 +528,9 @@ MidiDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can_ adjust_capture_position = 0; if (nominally_recording || (_session.get_record_enabled() && _session.config.get_punch_in())) { - OverlapType ot; + OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes); - ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes); - - switch (ot) { - case OverlapNone: - rec_nframes = 0; - break; - - case OverlapInternal: - /* ---------- recrange - |---| transrange - */ - rec_nframes = nframes; - rec_offset = 0; - break; - - case OverlapStart: - /* |--------| recrange - -----| transrange - */ - rec_nframes = transport_frame + nframes - first_recordable_frame; - if (rec_nframes) { - rec_offset = first_recordable_frame - transport_frame; - } - break; - - case OverlapEnd: - /* |--------| recrange - |-------- transrange - */ - rec_nframes = last_recordable_frame - transport_frame; - rec_offset = 0; - break; - - case OverlapExternal: - /* |--------| recrange - -------------- transrange - */ - rec_nframes = last_recordable_frame - last_recordable_frame; - rec_offset = first_recordable_frame - transport_frame; - break; - } + calculate_record_range(ot, transport_frame, nframes, rec_nframes, rec_offset); if (rec_nframes && !was_recording) { capture_captured = 0;