summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-10-20 02:14:53 +0000
committerDavid Robillard <d@drobilla.net>2009-10-20 02:14:53 +0000
commited3b46e03bb06e8f0f1624c27fb72244fac23538 (patch)
treefab02c695794c0719d3bf382bb1adb1fb7258d88
parent22fd9aec55587a50c427fff8f5e800afcef6ac69 (diff)
Factor out more duplicated code.
git-svn-id: svn://localhost/ardour2/branches/3.0@5819 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--libs/ardour/ardour/diskstream.h5
-rw-r--r--libs/ardour/audio_diskstream.cc44
-rw-r--r--libs/ardour/diskstream.cc45
-rw-r--r--libs/ardour/midi_diskstream.cc44
4 files changed, 53 insertions, 85 deletions
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<CaptureInfo*> 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);
-
- 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;
+ OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
- 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;