diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index d13789fa38..1021b8dba0 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -136,6 +136,7 @@ class Playlist : public SessionObject void add_region (boost::shared_ptr, framepos_t position, float times = 1, bool auto_partition = false); void remove_region (boost::shared_ptr); + void remove_region_by_source (boost::shared_ptr); void get_equivalent_regions (boost::shared_ptr, std::vector >&); void get_region_list_equivalent_regions (boost::shared_ptr, std::vector >&); void replace_region (boost::shared_ptr old, boost::shared_ptr newr, framepos_t pos); diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index e58c8896bd..fa2cdce014 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -1321,6 +1321,10 @@ MidiDiskstream::use_new_write_source (uint32_t n) if (_write_source) { if (_write_source->is_empty ()) { + /* remove any region that is using this empty source; they can result when MIDI recordings + are made, but no MIDI data is received. + */ + _playlist->remove_region_by_source (_write_source); _write_source->mark_for_remove (); _write_source->drop_references (); _write_source.reset(); diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 7c9ac93c3c..1d506dcee7 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -2939,3 +2939,22 @@ Playlist::has_region_at (framepos_t const p) const return (i != regions.end()); } + +/** Remove any region that uses a given source */ +void +Playlist::remove_region_by_source (boost::shared_ptr s) +{ + RegionLock rl (this); + + RegionList::iterator i = regions.begin(); + while (i != regions.end()) { + RegionList::iterator j = i; + ++j; + + if ((*i)->uses_source (s)) { + remove_region_internal (*i); + } + + i = j; + } +}