From 36d0a6e908cb9fe6aaf495e52ade6a0bac527fc9 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 4 Jun 2024 13:21:55 -0600 Subject: [PATCH] fix dangling references to a MidiRegion and MidiTrack in a MidiView --- gtk2_ardour/midi_view.cc | 21 +++++++++++++++++++-- gtk2_ardour/midi_view.h | 4 ++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/midi_view.cc b/gtk2_ardour/midi_view.cc index 0b70ab03d1..812f3507b0 100644 --- a/gtk2_ardour/midi_view.cc +++ b/gtk2_ardour/midi_view.cc @@ -174,6 +174,7 @@ MidiView::MidiView (MidiView const & other) void MidiView::init () { + _midi_track->DropReferences.connect (track_going_away_connection, invalidator (*this), boost::bind (&MidiView::track_going_away, this), gui_context()); _patch_change_outline = UIConfiguration::instance().color ("midi patch change outline"); _patch_change_fill = UIConfiguration::instance().color_mod ("midi patch change fill", "midi patch change fill"); @@ -181,15 +182,31 @@ MidiView::init () EditingContext::DropDownKeys.connect (sigc::mem_fun (*this, &MidiView::drop_down_keys)); } +void +MidiView::track_going_away () +{ + _midi_track.reset (); +} + +void +MidiView::region_going_away () +{ + _midi_region.reset (); + _model.reset (); + connections_requiring_model.drop_connections(); +} + void MidiView::set_region (std::shared_ptr mr) { _midi_region = mr; if (!_midi_region) { - _model.reset (); - connections_requiring_model.drop_connections(); + region_going_away (); return; } + + _midi_region->DropReferences.connect (region_going_away_connection, invalidator (*this), boost::bind (&MidiView::region_going_away, this), gui_context()); + set_model (_midi_region->midi_source (0)->model()); } diff --git a/gtk2_ardour/midi_view.h b/gtk2_ardour/midi_view.h index 71a9615821..763467825a 100644 --- a/gtk2_ardour/midi_view.h +++ b/gtk2_ardour/midi_view.h @@ -444,6 +444,10 @@ class MidiView : public virtual sigc::trackable bool note_canvas_event(GdkEvent* ev); PBD::ScopedConnectionList connections_requiring_model; + PBD::ScopedConnection track_going_away_connection; + PBD::ScopedConnection region_going_away_connection; + void track_going_away (); + void region_going_away (); void midi_channel_mode_changed (); void instrument_settings_changed ();