X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fdiskstream.cc;h=40a2714dc0735e9ea865109d5bbf9797d41e236f;hb=56469c195640b561119852fd6d27a4b56e5af7e2;hp=07a1217b7a61fc426c030cfe77c4432f944d9abb;hpb=e31c2e4dcbaa7bfeb04629ba603016d00a34e0c4;p=ardour.git diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 07a1217b7a..40a2714dc0 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -52,7 +52,7 @@ #include "ardour/panner.h" #include "ardour/session.h" #include "ardour/io.h" -#include "ardour/route.h" +#include "ardour/track.h" #include "i18n.h" #include @@ -74,7 +74,7 @@ PBD::Signal0 Diskstream::DiskUnderrun; Diskstream::Diskstream (Session &sess, const string &name, Flag flag) : SessionObject(sess, name) , i_am_the_modifier (0) - , _route (0) + , _track (0) , _record_enabled (0) , _visible_speed (1.0f) , _actual_speed (1.0f) @@ -96,7 +96,7 @@ Diskstream::Diskstream (Session &sess, const string &name, Flag flag) , loop_location (0) , overwrite_frame (0) , overwrite_offset (0) - , pending_overwrite (false) + , _pending_overwrite (false) , overwrite_queued (false) , input_change_pending (NoChange) , wrap_buffer_size (0) @@ -122,7 +122,7 @@ Diskstream::Diskstream (Session &sess, const string &name, Flag flag) Diskstream::Diskstream (Session& sess, const XMLNode& /*node*/) : SessionObject(sess, "unnamed diskstream") , i_am_the_modifier (0) - , _route (0) + , _track (0) , _record_enabled (0) , _visible_speed (1.0f) , _actual_speed (1.0f) @@ -144,7 +144,7 @@ Diskstream::Diskstream (Session& sess, const XMLNode& /*node*/) , loop_location (0) , overwrite_frame (0) , overwrite_offset (0) - , pending_overwrite (false) + , _pending_overwrite (false) , overwrite_queued (false) , input_change_pending (NoChange) , wrap_buffer_size (0) @@ -176,10 +176,10 @@ Diskstream::~Diskstream () } void -Diskstream::set_route (Route& r) +Diskstream::set_track (Track* t) { - _route = &r; - _io = _route->input(); + _track = t; + _io = _track->input(); ic_connection.disconnect(); _io->changed.connect_same_thread (ic_connection, boost::bind (&Diskstream::handle_input_change, this, _1, _2)); @@ -188,7 +188,7 @@ Diskstream::set_route (Route& r) non_realtime_input_change (); set_align_style_from_io (); - _route->Destroyed.connect_same_thread (*this, boost::bind (&Diskstream::route_going_away, this)); + _track->Destroyed.connect_same_thread (*this, boost::bind (&Diskstream::route_going_away, this)); } void @@ -331,15 +331,6 @@ Diskstream::set_roll_delay (ARDOUR::nframes_t nframes) _roll_delay = nframes; } -void -Diskstream::set_speed (double sp) -{ - _session.request_diskstream_speed (*this, sp); - - /* to force a rebuffering at the right place */ - playlist_modified(); -} - int Diskstream::use_playlist (boost::shared_ptr playlist) { @@ -381,7 +372,7 @@ Diskstream::use_playlist (boost::shared_ptr playlist) */ if (!overwrite_queued && prior_playlist) { - _session.request_overwrite_buffer (this); + _session.request_overwrite_buffer (_track); overwrite_queued = true; } @@ -401,7 +392,7 @@ void Diskstream::playlist_modified () { if (!i_am_the_modifier && !overwrite_queued) { - _session.request_overwrite_buffer (this); + _session.request_overwrite_buffer (_track); overwrite_queued = true; } } @@ -459,7 +450,7 @@ Diskstream::remove_region_from_last_capture (boost::weak_ptr wregion) void Diskstream::playlist_ranges_moved (list< Evoral::RangeMove > const & movements_frames) { - if (!_route || Config->get_automation_follows_regions () == false) { + if (!_track || Config->get_automation_follows_regions () == false) { return; } @@ -473,7 +464,7 @@ Diskstream::playlist_ranges_moved (list< Evoral::RangeMove > const & } /* move panner automation */ - boost::shared_ptr p = _route->main_outs()->panner (); + boost::shared_ptr p = _track->main_outs()->panner (); if (p) { for (uint32_t i = 0; i < p->npanners (); ++i) { boost::shared_ptr pan_alist = p->streampanner(i).pan_control()->alist(); @@ -485,7 +476,7 @@ Diskstream::playlist_ranges_moved (list< Evoral::RangeMove > const & } /* move processor automation */ - _route->foreach_processor (boost::bind (&Diskstream::move_processor_automation, this, _1, movements_frames)); + _track->foreach_processor (boost::bind (&Diskstream::move_processor_automation, this, _1, movements_frames)); } void @@ -525,6 +516,7 @@ Diskstream::check_record_status (nframes_t transport_frame, nframes_t /*nframes* const int transport_rolling = 0x4; const int track_rec_enabled = 0x2; const int global_rec_enabled = 0x1; + const int fully_rec_enabled = (transport_rolling|track_rec_enabled|global_rec_enabled); /* merge together the 3 factors that affect record status, and compute what has changed. @@ -537,88 +529,101 @@ Diskstream::check_record_status (nframes_t transport_frame, nframes_t /*nframes* if (possibly_recording == last_possibly_recording) { return; } + if (possibly_recording == fully_rec_enabled) { - /* change state */ - - /* if per-track or global rec-enable turned on while the other was already on, we've started recording */ - - if (((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record)) || - ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) { - - /* starting to record: compute first+last frames */ + if (last_possibly_recording == fully_rec_enabled) { + return; + } + /* we transitioned to recording. lets see if its transport based or a punch */ + first_recordable_frame = transport_frame + _capture_offset; last_recordable_frame = max_frames; capture_start_frame = transport_frame; - if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) { - - /* was stopped, now rolling (and recording) */ + if (change & transport_rolling) { + /* transport-change (started rolling) */ + if (_alignment_style == ExistingMaterial) { - - first_recordable_frame += _session.worst_output_latency(); - - DEBUG_TRACE (DEBUG::Latency, string_compose ("Offset rec from stop. Capture offset: %1 Worst O/P Latency: %2 Roll Delay: %3 First Recordable Frame: %4 Transport Frame: %5\n", - _capture_offset, _session.worst_output_latency(), _roll_delay, first_recordable_frame, transport_frame)); - } else { + + /* there are two delays happening: + + 1) inbound, represented by _capture_offset + 2) outbound, represented by _session.worst_output_latency() + + the first sample to record occurs when the larger of these + two has elapsed, since they occur in parallel. + + since we've already added _capture_offset, just add the + difference if _session.worst_output_latency() is larger. + */ + + if (_capture_offset < _session.worst_output_latency()) { + first_recordable_frame += (_session.worst_output_latency() - _capture_offset); + } + } else { first_recordable_frame += _roll_delay; - } - - } else { + } + + } else { - /* was rolling, but record state changed */ + /* punch in */ if (_alignment_style == ExistingMaterial) { - /* manual punch in happens at the correct transport frame - because the user hit a button. but to get alignment correct - we have to back up the position of the new region to the - appropriate spot given the roll delay. - */ - - - /* autopunch toggles recording at the precise + /* There are two kinds of punch: + + manual punch in happens at the correct transport frame + because the user hit a button. but to get alignment correct + we have to back up the position of the new region to the + appropriate spot given the roll delay. + + autopunch toggles recording at the precise transport frame, and then the DS waits to start recording for a time that depends on the output latency. - */ - - first_recordable_frame += _session.worst_output_latency(); - - DEBUG_TRACE (DEBUG::Latency, string_compose ("Punch in manual/auto. Capture offset: %1 Worst O/P Latency: %2 Roll Delay: %3 First Recordable Frame: %4 Transport Frame: %5\n", - _capture_offset, _session.worst_output_latency(), _roll_delay, first_recordable_frame, transport_frame)); - } else { - if (_session.config.get_punch_in()) { - first_recordable_frame += _roll_delay; - } else { - capture_start_frame -= _roll_delay; - } - } - - } - - prepare_record_status(capture_start_frame); + XXX: BUT THIS CODE DOESN'T DIFFERENTIATE !!! - } else if (!record_enabled() || !can_record) { - - /* stop recording */ + */ - last_recordable_frame = transport_frame + _capture_offset; + if (_capture_offset < _session.worst_output_latency()) { + /* see comment in ExistingMaterial block above */ + first_recordable_frame += (_session.worst_output_latency() - _capture_offset); + } - if (_alignment_style == ExistingMaterial) { - last_recordable_frame += _session.worst_output_latency(); - } else { - last_recordable_frame += _roll_delay; - } - - //first_recordable_frame = max_frames; - - DEBUG_TRACE (DEBUG::Latency, string_compose ("Stop record - %6 | %7. Capture offset: %1 Worst O/P Latency: %2 Roll Delay: %3 First Recordable Frame: %4 Transport Frame: %5\n", - _capture_offset, _session.worst_output_latency(), _roll_delay, first_recordable_frame, transport_frame, - can_record, record_enabled())); - } + } else { + capture_start_frame -= _roll_delay; + } + } + + prepare_record_status (capture_start_frame); + + } else { + + if (last_possibly_recording == fully_rec_enabled) { + + /* we were recording last time */ + + if (change & transport_rolling) { + /* transport-change (stopped rolling): last_recordable_frame was set in ::prepare_to_stop() */ + + } else { + /* punch out */ + + last_recordable_frame = transport_frame + _capture_offset; + + if (_alignment_style == ExistingMaterial) { + if (_session.worst_output_latency() > _capture_offset) { + last_recordable_frame += (_session.worst_output_latency() - _capture_offset); + } + } else { + last_recordable_frame += _roll_delay; + } + } + } + } last_possibly_recording = possibly_recording; } @@ -673,3 +678,9 @@ Diskstream::calculate_record_range(OverlapType ot, sframes_t transport_frame, nf break; } } + +void +Diskstream::prepare_to_stop (framepos_t pos) +{ + last_recordable_frame = pos + _capture_offset; +}