diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index 23f8c715c5..e288300481 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -178,6 +178,7 @@ public: { Glib::Threads::Mutex::Lock lm (_operation_rgroup_mutex); if (_retained_group_id == 0) { + _retained_take_cnt = 0; ++_next_group_id; _operation_rgroup_map.clear (); // this is used for split & paste operations that honor the region's prior grouping _retained_group_id = _next_group_id << 4; // this is used for newly created regions via recording or importing @@ -191,6 +192,7 @@ public: if (_clear_on_destruction) { Glib::Threads::Mutex::Lock lm (_operation_rgroup_mutex); _retained_group_id = 0; + _next_group_id += _retained_take_cnt; _operation_rgroup_map.clear(); } } @@ -200,9 +202,14 @@ public: static uint64_t next_group_id () { return _next_group_id; } static void set_next_group_id (uint64_t ngid) { _next_group_id = ngid; } - /* access the retained group-id for actions like Recording, Import */ - static uint64_t get_retained_group_id () { - return _retained_group_id; + /* access the retained group-id for actions like Recording, Import. + * + * Note When a single take creates multiple layered regions (e.g. loop recording) + * then the group id need to be bumped for each take + */ + static uint64_t get_retained_group_id (uint64_t take = 0) { + _retained_take_cnt = std::max (_retained_take_cnt, take); + return _retained_group_id + (take << 4); } /* access the group-id for an operation on a region, honoring the existing region's group status */ @@ -617,6 +624,7 @@ private: Explicit = 0x1, // the user has explicitly grouped or ungrouped this region. explicitly grouped regions can cross track-group boundaries }; static uint64_t _retained_group_id; + static uint64_t _retained_take_cnt; static uint64_t _next_group_id; static Glib::Threads::Mutex _operation_rgroup_mutex; diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 370a150930..ad24525baa 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -93,6 +93,7 @@ PBD::Signal2,const PropertyChange&> Reg /* these static values are used by Region Groups to assign a group-id across the scope of an operation that might span many function calls */ uint64_t Region::_retained_group_id = 0; +uint64_t Region::_retained_take_cnt = 0; uint64_t Region::_next_group_id = 0; std::map Region::_operation_rgroup_map; diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index a0dc411e6d..f294ff299d 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -1051,7 +1051,8 @@ Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture const samplepos_t preroll_off = _session.preroll_record_trim_len (); const timepos_t cstart (timepos_t (capture_info.front()->start).beats()); - for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) { + int cnt = 0; + for (ci = capture_info.begin(); ci != capture_info.end(); ++ci, ++cnt) { string region_name; @@ -1089,7 +1090,7 @@ Track::use_captured_midi_sources (SourceList& srcs, CaptureInfos const & capture plist.add (Properties::length, l); plist.add (Properties::opaque, rmode != RecSoundOnSound); plist.add (Properties::name, region_name); - plist.add (Properties::reg_group, Region::get_retained_group_id()); + plist.add (Properties::reg_group, Region::get_retained_group_id (cnt)); std::shared_ptr rx (RegionFactory::create (srcs, plist)); midi_region = std::dynamic_pointer_cast (rx); @@ -1177,7 +1178,8 @@ Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & captur samplecnt_t buffer_position = afs->last_capture_start_sample (); CaptureInfos::const_iterator ci; - for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) { + int cnt = 0; + for (ci = capture_info.begin(); ci != capture_info.end(); ++ci, ++cnt) { string region_name; @@ -1194,7 +1196,7 @@ Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & captur plist.add (Properties::length, timecnt_t ((*ci)->samples, timepos_t::zero (false))); plist.add (Properties::name, region_name); plist.add (Properties::opaque, rmode != RecSoundOnSound); - plist.add (Properties::reg_group, Region::get_retained_group_id()); + plist.add (Properties::reg_group, Region::get_retained_group_id (cnt)); std::shared_ptr rx (RegionFactory::create (srcs, plist)); region = std::dynamic_pointer_cast (rx);