X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fdiskstream.cc;h=41f1eccdf7248dc3b62d6f5d69b96bedb12d22c5;hb=61f9ca9f3c3fb8283ebc67c39f9083730511488b;hp=6ef4327343069aa309950246dee9420190347c91;hpb=23bec25bf525dfc1434fe8b95f6d81c9387ac9c5;p=ardour.git diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 6ef4327343..41f1eccdf7 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -252,8 +252,18 @@ Diskstream::set_capture_offset () return; } - _capture_offset = _io->latency(); - DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: using IO latency, capture offset set to %2\n", name(), _capture_offset)); + switch (_alignment_style) { + case ExistingMaterial: + _capture_offset = _io->latency(); + break; + + case CaptureTime: + default: + _capture_offset = 0; + break; + } + + DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: using IO latency, capture offset set to %2 with style = %3\n", name(), _capture_offset, enum_2_string (_alignment_style))); } @@ -266,6 +276,7 @@ Diskstream::set_align_style (AlignStyle a, bool force) if ((a != _alignment_style) || force) { _alignment_style = a; + set_capture_offset (); AlignmentStyleChanged (); } } @@ -280,17 +291,17 @@ Diskstream::set_align_choice (AlignChoice a, bool force) if ((a != _alignment_choice) || force) { _alignment_choice = a; - switch (_alignment_choice) { - case Automatic: - set_align_style_from_io (); - break; - case UseExistingMaterial: - set_align_style (ExistingMaterial); - break; - case UseCaptureTime: - set_align_style (CaptureTime); - break; - } + switch (_alignment_choice) { + case Automatic: + set_align_style_from_io (); + break; + case UseExistingMaterial: + set_align_style (ExistingMaterial); + break; + case UseCaptureTime: + set_align_style (CaptureTime); + break; + } } } @@ -437,7 +448,13 @@ Diskstream::set_name (const string& str) playlist()->set_name (str); SessionObject::set_name(str); } - return true; + return true; +} + +bool +Diskstream::set_write_source_name (const std::string& str) { + _write_source_name = str; + return true; } XMLNode& @@ -570,7 +587,7 @@ Diskstream::move_processor_automation (boost::weak_ptr p, list< Evora set const a = processor->what_can_be_automated (); - for (set::iterator i = a.begin (); i != a.end (); ++i) { + for (set::const_iterator i = a.begin (); i != a.end (); ++i) { boost::shared_ptr al = processor->automation_control(*i)->alist(); XMLNode & before = al->get_state (); bool const things_moved = al->move_ranges (movements); @@ -593,27 +610,27 @@ Diskstream::check_record_status (framepos_t transport_frame, bool can_record) 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); + 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. - */ + * what has changed. + */ rolling = _session.transport_speed() != 0.0f; - possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record; + possibly_recording = (rolling << 2) | ((int)record_enabled() << 1) | (int)can_record; change = possibly_recording ^ last_possibly_recording; if (possibly_recording == last_possibly_recording) { return; } - framecnt_t existing_material_offset = _session.worst_playback_latency(); + const framecnt_t existing_material_offset = _session.worst_playback_latency(); - if (possibly_recording == fully_rec_enabled) { + if (possibly_recording == fully_rec_enabled) { - if (last_possibly_recording == fully_rec_enabled) { - return; - } + if (last_possibly_recording == fully_rec_enabled) { + return; + } capture_start_frame = _session.transport_frame(); first_recordable_frame = capture_start_frame + _capture_offset; @@ -636,32 +653,32 @@ Diskstream::check_record_status (framepos_t transport_frame, bool can_record) first_recordable_frame)); } - prepare_record_status (capture_start_frame); + prepare_record_status (capture_start_frame); - } else { + } else { - if (last_possibly_recording == fully_rec_enabled) { + if (last_possibly_recording == fully_rec_enabled) { - /* we were recording last time */ + /* we were recording last time */ - if (change & transport_rolling) { + if (change & transport_rolling) { - /* transport-change (stopped rolling): last_recordable_frame was set in ::prepare_to_stop(). We - had to set it there because we likely rolled past the stopping point to declick out, - and then backed up. - */ + /* transport-change (stopped rolling): last_recordable_frame was set in ::prepare_to_stop(). We + * had to set it there because we likely rolled past the stopping point to declick out, + * and then backed up. + */ - } else { - /* punch out */ + } else { + /* punch out */ - last_recordable_frame = _session.transport_frame() + _capture_offset; + last_recordable_frame = _session.transport_frame() + _capture_offset; - if (_alignment_style == ExistingMaterial) { - last_recordable_frame += existing_material_offset; - } - } - } - } + if (_alignment_style == ExistingMaterial) { + last_recordable_frame += existing_material_offset; + } + } + } + } last_possibly_recording = possibly_recording; } @@ -683,16 +700,16 @@ Diskstream::calculate_record_range (Evoral::OverlapType ot, framepos_t transport case Evoral::OverlapInternal: /* ---------- recrange - |---| transrange - */ + * |---| transrange + */ rec_nframes = nframes; rec_offset = 0; break; case Evoral::OverlapStart: /* |--------| recrange - -----| transrange - */ + * -----| transrange + */ rec_nframes = transport_frame + nframes - first_recordable_frame; if (rec_nframes) { rec_offset = first_recordable_frame - transport_frame; @@ -701,16 +718,16 @@ Diskstream::calculate_record_range (Evoral::OverlapType ot, framepos_t transport case Evoral::OverlapEnd: /* |--------| recrange - |-------- transrange - */ + * |-------- transrange + */ rec_nframes = last_recordable_frame - transport_frame; rec_offset = 0; break; case Evoral::OverlapExternal: /* |--------| recrange - -------------- transrange - */ + * -------------- transrange + */ rec_nframes = last_recordable_frame - first_recordable_frame; rec_offset = first_recordable_frame - transport_frame; break; @@ -722,9 +739,26 @@ Diskstream::calculate_record_range (Evoral::OverlapType ot, framepos_t transport } void -Diskstream::prepare_to_stop (framepos_t pos) +Diskstream::prepare_to_stop (framepos_t transport_frame, framepos_t audible_frame) { - last_recordable_frame = pos + _capture_offset; + switch (_alignment_style) { + case ExistingMaterial: + last_recordable_frame = transport_frame + _capture_offset; + DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose("%1: prepare to stop sets last recordable frame to %2 + %3 = %4\n", _name, transport_frame, _capture_offset, last_recordable_frame)); + break; + + case CaptureTime: + last_recordable_frame = audible_frame; // note that capture_offset is zero + /* we may already have captured audio before the last_recordable_frame (audible frame), + so deal with this. + */ + if (last_recordable_frame > capture_start_frame) { + capture_captured = min (capture_captured, last_recordable_frame - capture_start_frame); + } + DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose("%1: prepare to stop sets last recordable frame to audible frame @ %2\n", _name, audible_frame)); + break; + } + } void @@ -738,4 +772,3 @@ Diskstream::disengage_record_enable () { g_atomic_int_set (&_record_enabled, 0); } -