mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-01 03:17:39 +01:00
Factor out more duplicated code.
git-svn-id: svn://localhost/ardour2/branches/3.0@5819 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
22fd9aec55
commit
ed3b46e03b
4 changed files with 53 additions and 85 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue