diff options
author | Robin Gareus <robin@gareus.org> | 2017-01-19 13:03:57 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-01-19 13:05:54 +0100 |
commit | 9c08a403c4c0a169acf44c741af1c40b16e23795 (patch) | |
tree | a237c82529b9e2bfddbac109336b0c807851c94e /libs/ardour | |
parent | e959a762b5a0d09b92a95e2171a22d86b655a1c5 (diff) |
Add alternative preroll record mode:
* Start recording at preroll, trim region to skip preroll at rec-stop
* Keep old punch-in rec-at-preroll API for tape-tracks (later)
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/session.h | 5 | ||||
-rw-r--r-- | libs/ardour/audio_diskstream.cc | 6 | ||||
-rw-r--r-- | libs/ardour/midi_diskstream.cc | 6 | ||||
-rw-r--r-- | libs/ardour/session.cc | 1 | ||||
-rw-r--r-- | libs/ardour/session_transport.cc | 27 |
5 files changed, 43 insertions, 2 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 88e85dee86..fb0860bd78 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1002,10 +1002,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop framecnt_t preroll_samples (framepos_t) const; void request_preroll_record_punch (framepos_t start, framecnt_t preroll); + void request_preroll_record_trim (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; } + framecnt_t preroll_record_trim_len () const { return _preroll_record_trim_len; } + /* temporary hacks to allow selection to be pushed from GUI into backend. Whenever we move the selection object into libardour, these will go away. */ @@ -1924,8 +1927,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop Evoral::Range<framepos_t> _object_selection; void unset_preroll_record_punch (); + void unset_preroll_record_trim (); framepos_t _preroll_record_punch_pos; + framecnt_t _preroll_record_trim_len; /* main outs */ uint32_t main_outs; diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index 4bbcab419d..9dde222651 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -1641,6 +1641,7 @@ AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, boo _playlist->set_capture_insertion_in_progress (true); _playlist->freeze (); + const framepos_t preroll_off = _session.preroll_record_trim_len (); for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) { string region_name; @@ -1660,6 +1661,9 @@ AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, boo boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist)); region = boost::dynamic_pointer_cast<AudioRegion> (rx); + if (preroll_off > 0) { + region->trim_front (buffer_position + preroll_off); + } } catch (failed_constructor& err) { @@ -1669,7 +1673,7 @@ AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, boo i_am_the_modifier++; - _playlist->add_region (region, (*ci)->start, 1, non_layered()); + _playlist->add_region (region, (*ci)->start + preroll_off, 1, non_layered()); _playlist->set_layer (region, DBL_MAX); i_am_the_modifier--; diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index ac47f13df1..ce9a3d55ea 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -1035,6 +1035,7 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen initial_capture = capture_info.front()->start; } + const framepos_t preroll_off = _session.preroll_record_trim_len (); for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) { string region_name; @@ -1058,6 +1059,9 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist)); region = boost::dynamic_pointer_cast<MidiRegion> (rx); + if (preroll_off > 0) { + region->trim_front ((*ci)->start - initial_capture + preroll_off); + } } catch (failed_constructor& err) { @@ -1068,7 +1072,7 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl; i_am_the_modifier++; - _playlist->add_region (region, (*ci)->start); + _playlist->add_region (region, (*ci)->start + preroll_off); i_am_the_modifier--; } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 0f6f74ef5d..b17b859490 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -305,6 +305,7 @@ Session::Session (AudioEngine &eng, , _range_selection (-1,-1) , _object_selection (-1,-1) , _preroll_record_punch_pos (-1) + , _preroll_record_trim_len (0) , main_outs (0) , first_file_data_format_reset (true) , first_file_header_format_reset (true) diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 35eb02bf3c..4a729700ab 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -171,12 +171,19 @@ Session::unset_preroll_record_punch () } void +Session::unset_preroll_record_trim () +{ + _preroll_record_trim_len = 0; +} + +void Session::request_preroll_record_punch (framepos_t rec_in, framecnt_t preroll) { if (actively_recording ()) { return; } unset_preroll_record_punch (); + unset_preroll_record_trim (); framepos_t start = std::max ((framepos_t)0, rec_in - preroll); _preroll_record_punch_pos = rec_in; @@ -191,6 +198,25 @@ Session::request_preroll_record_punch (framepos_t rec_in, framecnt_t preroll) } void +Session::request_preroll_record_trim (framepos_t rec_in, framecnt_t preroll) +{ + if (actively_recording ()) { + return; + } + unset_preroll_record_punch (); + unset_preroll_record_trim (); + + config.set_punch_in (false); + config.set_punch_out (false); + + framepos_t pos = std::max ((framepos_t)0, rec_in - preroll); + _preroll_record_trim_len = preroll; + maybe_enable_record (); + request_locate (pos, true); + set_requested_return_frame (rec_in); +} + +void Session::request_play_loop (bool yn, bool change_transport_roll) { if (_slave && yn) { @@ -819,6 +845,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished) } clear_clicks(); + unset_preroll_record_trim (); /* do this before seeking, because otherwise the tracks will do the wrong thing in seamless loop mode. */ |