diff --git a/libs/ardour/ardour/disk_writer.h b/libs/ardour/ardour/disk_writer.h index 4a63f9b764..a427e938ec 100644 --- a/libs/ardour/ardour/disk_writer.h +++ b/libs/ardour/ardour/disk_writer.h @@ -84,6 +84,7 @@ public: bool configure_io (ChanCount in, ChanCount out); std::list >& last_capture_sources () { return _last_capture_sources; } + void reset_last_capture_sources (); bool record_enabled () const { return _record_enabled.load(); } bool record_safe () const { return _record_safe.load(); } @@ -192,6 +193,7 @@ private: std::atomic _record_safe; std::atomic _samples_pending_write; std::atomic _num_captured_loops; + std::atomic _reset_last_capture_sources; std::shared_ptr _midi_write_source; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index e0b0389b8e..d8fbc8d634 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -872,6 +872,7 @@ public: int remove_last_capture (); void get_last_capture_sources (std::list >&); + void reset_last_capture_sources (); /** handlers should return -1 for "stop cleanup", 0 for "yes, delete this playlist", diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h index 855a78f841..b0e9bab4d3 100644 --- a/libs/ardour/ardour/track.h +++ b/libs/ardour/ardour/track.h @@ -144,6 +144,7 @@ public: void request_input_monitoring (bool); void ensure_input_monitoring (bool); std::list > & last_capture_sources (); + void reset_last_capture_sources (); std::string steal_write_source_name (); void reset_write_sources (bool mark_write_complete); float playback_buffer_load () const; diff --git a/libs/ardour/disk_writer.cc b/libs/ardour/disk_writer.cc index 21493640a9..6d8d5e55c7 100644 --- a/libs/ardour/disk_writer.cc +++ b/libs/ardour/disk_writer.cc @@ -69,6 +69,7 @@ DiskWriter::DiskWriter (Session& s, Track& t, string const & str, DiskIOProcesso _record_safe.store (0); _samples_pending_write.store (0); _num_captured_loops.store (0); + _reset_last_capture_sources.store (0); } DiskWriter::~DiskWriter () @@ -281,6 +282,12 @@ DiskWriter::calculate_record_range (Temporal::OverlapType ot, samplepos_t transp _first_recordable_sample, _last_recordable_sample, rec_nframes, rec_offset)); } +void +DiskWriter::reset_last_capture_sources () +{ + _reset_last_capture_sources.store (1); +} + void DiskWriter::engage_record_enable () { @@ -561,7 +568,9 @@ DiskWriter::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp } - if (can_record && !_last_capture_sources.empty ()) { + int canderef (1); + const bool reset_capture_src = _reset_last_capture_sources.compare_exchange_strong (canderef, 0); + if ((reset_capture_src || can_record) && !_last_capture_sources.empty ()) { _last_capture_sources.clear (); } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 31f282b108..f40b60e77d 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -4856,6 +4856,20 @@ Session::get_last_capture_sources (std::list >& srcs) } } +void +Session::reset_last_capture_sources () +{ + std::shared_ptr rl = routes.reader (); + for (auto const& i : *rl) { + std::shared_ptr tr = std::dynamic_pointer_cast (i); + if (!tr) { + continue; + } + tr->reset_last_capture_sources (); + + } +} + /* Source Management */ void diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index a4fd955624..974bb21fb9 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -585,6 +585,12 @@ Track::last_capture_sources () return _disk_writer->last_capture_sources (); } +void +Track::reset_last_capture_sources () +{ + _disk_writer->reset_last_capture_sources (); +} + std::string Track::steal_write_source_name() {