diff options
author | Robin Gareus <robin@gareus.org> | 2017-07-01 02:22:44 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-07-01 02:55:47 +0200 |
commit | d421e56fc0d8fafbaa5a11690c6f7c0d728ed4c4 (patch) | |
tree | 552a65893ca397f218416376036a546f9d8ce96d /libs/surfaces/faderport8 | |
parent | f7452c2a3a275356de32b4019a57034c7b8afe2f (diff) |
FP8: Clear input port on close. Fixes crash when switching snapshots
The midi_input_handler for the AsyncMIDIPort is connected to the
main event-loop. Events may still be delivered after the surface was
destroyed.
That by itself is not harmful, unless a given message produces a reply:
The _output_port is already gone, FaderPort8::tx_midi crashes.
Diffstat (limited to 'libs/surfaces/faderport8')
-rw-r--r-- | libs/surfaces/faderport8/faderport8.cc | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/libs/surfaces/faderport8/faderport8.cc b/libs/surfaces/faderport8/faderport8.cc index 923f635324..50d8a213b0 100644 --- a/libs/surfaces/faderport8/faderport8.cc +++ b/libs/surfaces/faderport8/faderport8.cc @@ -150,6 +150,9 @@ FaderPort8::~FaderPort8 () if (_input_port) { DEBUG_TRACE (DEBUG::FaderPort8, string_compose ("unregistering input port %1\n", boost::shared_ptr<ARDOUR::Port>(_input_port)->name())); + _input_port->disconnect_all (); + _input_port->drain (5000, 50000); + _input_port->clear (); AudioEngine::instance()->unregister_port (_input_port); _input_port.reset (); } @@ -461,7 +464,7 @@ FaderPort8::midi_input_handler (Glib::IOCondition ioc, boost::weak_ptr<ARDOUR::A { boost::shared_ptr<AsyncMIDIPort> port (wport.lock()); - if (!port) { + if (!port || !_input_port) { return false; } |