Fix SourceListBase::remove_source

* It was never called because SourceListBase::set_session
  subscribed to the signal just before SessionHandle::set_session
  dropped _session_connections
* remove_source() only checked the first source of the whole-file
  region, not all sources of a multi-channel region.
  Stereo regions with mono sources are now properly cleaned up.
This commit is contained in:
Robin Gareus 2023-05-29 18:04:27 +02:00
parent 5dd35ff86a
commit 3c17721eff
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
1 changed files with 6 additions and 5 deletions

View File

@ -33,10 +33,10 @@ SourceListBase::SourceListBase ()
void void
SourceListBase::set_session (ARDOUR::Session* s) SourceListBase::set_session (ARDOUR::Session* s)
{ {
RegionListBase::set_session (s);
if (s) { if (s) {
s->SourceRemoved.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&SourceListBase::remove_weak_source, this, _1), gui_context ()); s->SourceRemoved.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&SourceListBase::remove_weak_source, this, _1), gui_context ());
} }
RegionListBase::set_session (s);
} }
void void
@ -53,14 +53,15 @@ SourceListBase::remove_source (std::shared_ptr<ARDOUR::Source> source)
{ {
TreeModel::iterator i; TreeModel::iterator i;
TreeModel::Children rows = _model->children (); TreeModel::Children rows = _model->children ();
for (i = rows.begin (); i != rows.end (); ++i) { for (i = rows.begin (); i != rows.end ();) {
std::shared_ptr<ARDOUR::Region> rr = (*i)[_columns.region]; std::shared_ptr<ARDOUR::Region> rr = (*i)[_columns.region];
if (rr->source () == source) { if (rr->uses_source (source)) {
RegionRowMap::iterator map_it = region_row_map.find (rr); RegionRowMap::iterator map_it = region_row_map.find (rr);
assert (map_it != region_row_map.end () && i == map_it->second); assert (map_it != region_row_map.end () && i == map_it->second);
region_row_map.erase (map_it); region_row_map.erase (map_it);
_model->erase (i); i = _model->erase (i);
break; } else {
++i;
} }
} }
} }