summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-01-19 12:57:47 +0100
committerRobin Gareus <robin@gareus.org>2017-01-19 13:05:54 +0100
commite959a762b5a0d09b92a95e2171a22d86b655a1c5 (patch)
treef23f1a5d44c8e11138c3e5c49a129cd2b67b943b /libs/ardour
parentebdf3de598413e135e1f92e19634ac5eb8abe752 (diff)
Rework preroll-rec API:
* rename: indicate that recording happens after preroll, punch-in * move API into libardour: rec+roll (no separate setup, seek, roll APIs)
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/session.h14
-rw-r--r--libs/ardour/audio_diskstream.cc4
-rw-r--r--libs/ardour/midi_diskstream.cc6
-rw-r--r--libs/ardour/session.cc6
-rw-r--r--libs/ardour/session_process.cc8
-rw-r--r--libs/ardour/session_transport.cc28
-rw-r--r--libs/ardour/track.cc2
7 files changed, 40 insertions, 28 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index a295f11297..88e85dee86 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -998,11 +998,14 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void maybe_update_session_range (framepos_t, framepos_t);
- void request_preroll_record (framepos_t);
- framepos_t preroll_record_in () const { return _preroll_record_in; }
- bool preroll_record_enabled () const { return _preroll_record_in >= 0; }
+ /* preroll */
framecnt_t preroll_samples (framepos_t) const;
+ void request_preroll_record_punch (framepos_t start, framecnt_t preroll);
+
+ framepos_t preroll_record_punch_pos () const { return _preroll_record_punch_pos; }
+ bool preroll_record_punch_enabled () const { return _preroll_record_punch_pos >= 0; }
+
/* temporary hacks to allow selection to be pushed from GUI into backend.
Whenever we move the selection object into libardour, these will go away.
*/
@@ -1920,8 +1923,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
Evoral::Range<framepos_t> _range_selection;
Evoral::Range<framepos_t> _object_selection;
- void unset_preroll_record ();
- framepos_t _preroll_record_in;
+ void unset_preroll_record_punch ();
+
+ framepos_t _preroll_record_punch_pos;
/* main outs */
uint32_t main_outs;
diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc
index f157d81ada..4bbcab419d 100644
--- a/libs/ardour/audio_diskstream.cc
+++ b/libs/ardour/audio_diskstream.cc
@@ -1923,8 +1923,8 @@ AudioDiskstream::get_state ()
Location* pi;
- if (_session.preroll_record_enabled ()) {
- snprintf (buf, sizeof (buf), "%" PRId64, _session.preroll_record_in ());
+ if (_session.preroll_record_punch_enabled ()) {
+ snprintf (buf, sizeof (buf), "%" PRId64, _session.preroll_record_punch_pos ());
} else if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
} else {
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 9e784cbd38..ac47f13df1 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -367,7 +367,7 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
adjust_capture_position = 0;
- if (nominally_recording || (re && was_recording && _session.get_record_enabled() && (_session.config.get_punch_in() || _session.preroll_record_enabled()))) {
+ if (nominally_recording || (re && was_recording && _session.get_record_enabled() && (_session.config.get_punch_in() || _session.preroll_record_punch_enabled()))) {
Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
// XXX should this be transport_frame + nframes - 1 ? coverage() expects its parameter ranges to include their end points
@@ -1238,8 +1238,8 @@ MidiDiskstream::get_state ()
Location* pi;
- if (_session.preroll_record_enabled ()) {
- snprintf (buf, sizeof (buf), "%" PRId64, _session.preroll_record_in ());
+ if (_session.preroll_record_punch_enabled ()) {
+ snprintf (buf, sizeof (buf), "%" PRId64, _session.preroll_record_punch_pos ());
} else if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
} else {
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 086edf2b45..0f6f74ef5d 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -304,7 +304,7 @@ Session::Session (AudioEngine &eng,
, _play_range (false)
, _range_selection (-1,-1)
, _object_selection (-1,-1)
- , _preroll_record_in (-1)
+ , _preroll_record_punch_pos (-1)
, main_outs (0)
, first_file_data_format_reset (true)
, first_file_header_format_reset (true)
@@ -2001,7 +2001,7 @@ Session::disable_record (bool rt_context, bool force)
if (!rt_context) {
remove_pending_capture_state ();
}
- unset_preroll_record ();
+ unset_preroll_record_punch ();
}
}
@@ -2039,7 +2039,7 @@ Session::maybe_enable_record (bool rt_context)
}
if (_transport_speed) {
- if (!config.get_punch_in() && !preroll_record_enabled ()) {
+ if (!config.get_punch_in() && !preroll_record_punch_enabled ()) {
enable_record ();
}
} else {
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index 7e802b7d92..766ce395e5 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -1156,7 +1156,7 @@ Session::process_event (SessionEvent* ev)
case SessionEvent::PunchIn:
// cerr << "PunchIN at " << transport_frame() << endl;
- if (config.get_punch_in() && record_status() == Enabled && !preroll_record_enabled()) {
+ if (config.get_punch_in() && record_status() == Enabled && !preroll_record_punch_enabled()) {
enable_record ();
}
remove = false;
@@ -1165,7 +1165,7 @@ Session::process_event (SessionEvent* ev)
case SessionEvent::PunchOut:
// cerr << "PunchOUT at " << transport_frame() << endl;
- if (config.get_punch_out() && !preroll_record_enabled()) {
+ if (config.get_punch_out() && !preroll_record_punch_enabled()) {
step_back_from_record ();
}
remove = false;
@@ -1173,7 +1173,7 @@ Session::process_event (SessionEvent* ev)
break;
case SessionEvent::RecordStart:
- if (preroll_record_enabled() && record_status() == Enabled) {
+ if (preroll_record_punch_enabled() && record_status() == Enabled) {
enable_record ();
}
remove = false;
@@ -1279,7 +1279,7 @@ Session::compute_stop_limit () const
return max_framepos;
}
- if (preroll_record_enabled ()) {
+ if (preroll_record_punch_enabled ()) {
return max_framepos;
}
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index 8a57456dde..35eb02bf3c 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -162,24 +162,32 @@ Session::force_locate (framepos_t target_frame, bool with_roll)
}
void
-Session::unset_preroll_record ()
+Session::unset_preroll_record_punch ()
{
- if (_preroll_record_in >= 0) {
- remove_event (_preroll_record_in, SessionEvent::RecordStart);
+ if (_preroll_record_punch_pos >= 0) {
+ remove_event (_preroll_record_punch_pos, SessionEvent::RecordStart);
}
- _preroll_record_in = -1;
+ _preroll_record_punch_pos = -1;
}
void
-Session::request_preroll_record (framepos_t rec_in)
+Session::request_preroll_record_punch (framepos_t rec_in, framecnt_t preroll)
{
- unset_preroll_record ();
- _preroll_record_in = rec_in;
- if (_preroll_record_in >= 0) {
- replace_event (SessionEvent::RecordStart, _preroll_record_in);
+ if (actively_recording ()) {
+ return;
+ }
+ unset_preroll_record_punch ();
+ framepos_t start = std::max ((framepos_t)0, rec_in - preroll);
+
+ _preroll_record_punch_pos = rec_in;
+ if (_preroll_record_punch_pos >= 0) {
+ replace_event (SessionEvent::RecordStart, _preroll_record_punch_pos);
config.set_punch_in (false);
config.set_punch_out (false);
}
+ maybe_enable_record ();
+ request_locate (start, true);
+ set_requested_return_frame (rec_in);
}
void
@@ -1604,7 +1612,7 @@ Session::start_transport ()
switch (record_status()) {
case Enabled:
- if (!config.get_punch_in() && !preroll_record_enabled()) {
+ if (!config.get_punch_in() && !preroll_record_punch_enabled()) {
enable_record ();
}
break;
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index 3f29a45291..69d8030776 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -957,7 +957,7 @@ Track::monitoring_state () const
* enabled and those where it is not.
*/
- if (_session.config.get_punch_in() || _session.config.get_punch_out() || _session.preroll_record_in () >= 0) {
+ if (_session.config.get_punch_in() || _session.config.get_punch_out() || _session.preroll_record_punch_enabled ()) {
session_rec = _session.actively_recording ();
} else {
session_rec = _session.get_record_enabled();