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)
This commit is contained in:
parent
e959a762b5
commit
9c08a403c4
@ -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;
|
||||
|
@ -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--;
|
||||
|
||||
|
@ -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--;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -170,6 +170,12 @@ Session::unset_preroll_record_punch ()
|
||||
_preroll_record_punch_pos = -1;
|
||||
}
|
||||
|
||||
void
|
||||
Session::unset_preroll_record_trim ()
|
||||
{
|
||||
_preroll_record_trim_len = 0;
|
||||
}
|
||||
|
||||
void
|
||||
Session::request_preroll_record_punch (framepos_t rec_in, framecnt_t preroll)
|
||||
{
|
||||
@ -177,6 +183,7 @@ Session::request_preroll_record_punch (framepos_t rec_in, framecnt_t preroll)
|
||||
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;
|
||||
@ -190,6 +197,25 @@ Session::request_preroll_record_punch (framepos_t rec_in, framecnt_t preroll)
|
||||
set_requested_return_frame (rec_in);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@ -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.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user