diff --git a/libs/ardour/ardour/midi_ui.h b/libs/ardour/ardour/midi_ui.h index 2f0f7d3a45..88ea021361 100644 --- a/libs/ardour/ardour/midi_ui.h +++ b/libs/ardour/ardour/midi_ui.h @@ -62,7 +62,7 @@ class LIBARDOUR_API MidiControlUI : public AbstractUI private: ARDOUR::Session& _session; - bool midi_input_handler (Glib::IOCondition, boost::shared_ptr); + bool midi_input_handler (Glib::IOCondition, boost::weak_ptr); void reset_ports (); void clear_ports (); diff --git a/libs/ardour/midi_ui.cc b/libs/ardour/midi_ui.cc index 1d2fe7c7e1..c11f96c071 100644 --- a/libs/ardour/midi_ui.cc +++ b/libs/ardour/midi_ui.cc @@ -82,8 +82,13 @@ MidiControlUI::do_request (MidiUIRequest* req) } bool -MidiControlUI::midi_input_handler (IOCondition ioc, boost::shared_ptr port) +MidiControlUI::midi_input_handler (IOCondition ioc, boost::weak_ptr wport) { + boost::shared_ptr port = wport.lock (); + if (!port) { + return false; + } + DEBUG_TRACE (DEBUG::MidiIO, string_compose ("something happend on %1\n", boost::shared_ptr (port)->name())); if (ioc & ~IO_IN) { @@ -130,7 +135,8 @@ MidiControlUI::reset_ports () } for (vector >::const_iterator pi = ports.begin(); pi != ports.end(); ++pi) { - (*pi)->xthread().set_receive_handler (sigc::bind (sigc::mem_fun (this, &MidiControlUI::midi_input_handler), *pi)); + (*pi)->xthread().set_receive_handler (sigc::bind ( + sigc::mem_fun (this, &MidiControlUI::midi_input_handler), boost::weak_ptr(*pi))); (*pi)->xthread().attach (_main_loop->get_context()); } }