summaryrefslogtreecommitdiff
path: root/libs/surfaces/generic_midi
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-04-16 18:55:42 +0200
committerRobin Gareus <robin@gareus.org>2017-04-16 19:06:17 +0200
commit55cd96df8dd6edbe9b3603b3dc3de6b53d185fd4 (patch)
treedaefa5df523414d93b500de0e64792893f36ad6d /libs/surfaces/generic_midi
parent7fe769fd14743e383fd7eb7d50f6702897a8e376 (diff)
Clean up after generic MIDI surface -- #7311
When there are some non-released MIDIControllables, signal are still delivered to the objects, even if there's no surface thread to handle the signals anymore.
Diffstat (limited to 'libs/surfaces/generic_midi')
-rw-r--r--libs/surfaces/generic_midi/generic_midi_control_protocol.cc34
1 files changed, 19 insertions, 15 deletions
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
index 7f711d7afe..0e072f49b3 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
@@ -224,6 +224,10 @@ GenericMidiControlProtocol::drop_all ()
controllables.clear ();
for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ++i) {
+ (*i)->connection.disconnect();
+ if ((*i)->own_mc) {
+ delete (*i)->mc;
+ }
delete *i;
}
pending_controllables.clear ();
@@ -363,19 +367,17 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
{
Glib::Threads::Mutex::Lock lm (pending_lock);
- MIDIPendingControllables::iterator ptmp;
for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ) {
- ptmp = i;
- ++ptmp;
if (((*i)->mc)->get_controllable() == c) {
+ (*i)->connection.disconnect();
if ((*i)->own_mc) {
delete (*i)->mc;
}
- (*i)->connection.disconnect();
delete *i;
- pending_controllables.erase (i);
+ i = pending_controllables.erase (i);
+ } else {
+ ++i;
}
- i = ptmp;
}
}
@@ -414,19 +416,14 @@ GenericMidiControlProtocol::learning_stopped (MIDIControllable* mc)
Glib::Threads::Mutex::Lock lm (pending_lock);
Glib::Threads::Mutex::Lock lm2 (controllables_lock);
- MIDIPendingControllables::iterator tmp;
-
for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ) {
- tmp = i;
- ++tmp;
-
if ( (*i)->mc == mc) {
(*i)->connection.disconnect();
delete *i;
- pending_controllables.erase(i);
+ i = pending_controllables.erase(i);
+ } else {
+ ++i;
}
-
- i = tmp;
}
/* add the controllable for which learning stopped to our list of
@@ -654,6 +651,10 @@ GenericMidiControlProtocol::set_state (const XMLNode& node, int version)
{
Glib::Threads::Mutex::Lock lm (pending_lock);
for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ++i) {
+ (*i)->connection.disconnect();
+ if ((*i)->own_mc) {
+ delete (*i)->mc;
+ }
delete *i;
}
pending_controllables.clear ();
@@ -694,6 +695,9 @@ GenericMidiControlProtocol::set_state (const XMLNode& node, int version)
if (mc->set_state (**niter, version) == 0) {
controllables.push_back (mc);
+ } else {
+ warning << string_compose ("Generic MIDI control: Failed to set state for Control ID: %1\n", id.to_s());
+ delete mc;
}
} else {
@@ -787,8 +791,8 @@ GenericMidiControlProtocol::load_bindings (const string& xmlpath)
if (child->property ("uri")) {
/* controllable */
+ Glib::Threads::Mutex::Lock lm2 (controllables_lock);
if ((mc = create_binding (*child)) != 0) {
- Glib::Threads::Mutex::Lock lm2 (controllables_lock);
controllables.push_back (mc);
}