summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-07-01 02:22:44 +0200
committerRobin Gareus <robin@gareus.org>2017-07-01 02:55:47 +0200
commitd421e56fc0d8fafbaa5a11690c6f7c0d728ed4c4 (patch)
tree552a65893ca397f218416376036a546f9d8ce96d
parentf7452c2a3a275356de32b4019a57034c7b8afe2f (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.
-rw-r--r--libs/surfaces/faderport8/faderport8.cc5
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;
}