diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 9360ca2c1c..d29461a657 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -920,37 +920,54 @@ Playlist::remove_gaps (timecnt_t const & gap_threshold, timecnt_t const & leave_ } void -Playlist::get_equivalent_regions (std::shared_ptr other, vector >& results) +Playlist::get_equivalent_regions (std::shared_ptr basis, vector>& results) { - switch (Config->get_region_equivalence ()) { - case Exact: - for (auto const & r : regions) { - if (r->exact_equivalent (other)) { - results.push_back (r); + if (basis->is_explicitly_ungrouped ()) { + /*user explicitly ungrouped this region, so we bail */ + return; + } + + if (basis->is_implicitly_ungrouped ()) { + /* no group defined ... we must guess ... fallback to 'region equivalence' behavior */ + + switch (Config->get_region_equivalence ()) { + case Exact: + for (auto const& r : regions) { + if (r->exact_equivalent (basis)) { + results.push_back (r); + } } - } - break; - case LayerTime: - for (auto const & r : regions) { - if (r->layer_and_time_equivalent (other)) { - results.push_back (r); + break; + case LayerTime: + for (auto const& r : regions) { + if (r->layer_and_time_equivalent (basis)) { + results.push_back (r); + } } - } - break; - case Enclosed: - for (auto const & r : regions) { - if (r->enclosed_equivalent (other)) { - results.push_back (r); + break; + case Enclosed: + for (auto const& r : regions) { + if (r->enclosed_equivalent (basis)) { + results.push_back (r); + } } - } - break; - case Overlap: - for (auto const & r : regions) { - if (r->overlap_equivalent (other)) { - results.push_back (r); + break; + case Overlap: + for (auto const& r : regions) { + if (r->overlap_equivalent (basis)) { + results.push_back (r); + } } - } - break; + break; + } + return; + } + + /* region has an implicit or explicit group-id; return all regions with the same group-id */ + for (auto const& r : regions) { + if (r->region_group () == basis->region_group ()) { + results.push_back (r); + } } }