From d53d0faf931314ec180f4236db2dffda21e69071 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 21 Jul 2016 14:00:18 -0400 Subject: [PATCH] a more reliable/robust/less complex version of previous commit --- .../generic_midi_control_protocol.cc | 27 ++++++++++--------- .../generic_midi_control_protocol.h | 11 +++++++- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index 627ad8d66e..d14a9ca24c 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -328,8 +328,11 @@ GenericMidiControlProtocol::start_learning (Controllable* c) for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ) { ptmp = i; ++ptmp; - if (((*i)->first)->get_controllable() == c) { - (*i)->second.disconnect(); + if (((*i)->mc)->get_controllable() == c) { + if ((*i)->own_mc) { + delete (*i)->mc; + } + (*i)->connection.disconnect(); delete *i; pending_controllables.erase (i); } @@ -338,6 +341,7 @@ GenericMidiControlProtocol::start_learning (Controllable* c) } MIDIControllable* mc = 0; + bool own_mc = false; for (MIDIControllables::iterator i = controllables.begin(); i != controllables.end(); ++i) { if ((*i)->get_controllable() && ((*i)->get_controllable()->id() == c->id())) { @@ -348,15 +352,14 @@ GenericMidiControlProtocol::start_learning (Controllable* c) if (!mc) { mc = new MIDIControllable (this, *_input_port->parser(), *c, false); - controllables.push_back (mc); + own_mc = true; } { Glib::Threads::Mutex::Lock lm (pending_lock); - MIDIPendingControllable* element = new MIDIPendingControllable; - element->first = mc; - c->LearningFinished.connect_same_thread (element->second, boost::bind (&GenericMidiControlProtocol::learning_stopped, this, mc)); + MIDIPendingControllable* element = new MIDIPendingControllable (mc, own_mc); + c->LearningFinished.connect_same_thread (element->connection, boost::bind (&GenericMidiControlProtocol::learning_stopped, this, mc)); pending_controllables.push_back (element); } @@ -376,8 +379,8 @@ GenericMidiControlProtocol::learning_stopped (MIDIControllable* mc) tmp = i; ++tmp; - if ( (*i)->first == mc) { - (*i)->second.disconnect(); + if ( (*i)->mc == mc) { + (*i)->connection.disconnect(); delete *i; pending_controllables.erase(i); } @@ -400,10 +403,10 @@ GenericMidiControlProtocol::stop_learning (Controllable* c) */ for (MIDIPendingControllables::iterator i = pending_controllables.begin(); i != pending_controllables.end(); ++i) { - if (((*i)->first)->get_controllable() == c) { - (*i)->first->stop_learning (); - dptr = (*i)->first; - (*i)->second.disconnect(); + if (((*i)->mc)->get_controllable() == c) { + (*i)->mc->stop_learning (); + dptr = (*i)->mc; + (*i)->connection.disconnect(); delete *i; pending_controllables.erase (i); diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h index c1e59bc0dc..d3709c5374 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h @@ -125,7 +125,16 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { typedef std::list MIDIActions; MIDIActions actions; - typedef std::pair MIDIPendingControllable; + struct MIDIPendingControllable { + MIDIControllable* mc; + bool own_mc; + PBD::ScopedConnection connection; + + MIDIPendingControllable (MIDIControllable* c, bool omc) + : mc (c) + , own_mc (omc) + {} + }; typedef std::list MIDIPendingControllables; MIDIPendingControllables pending_controllables; Glib::Threads::Mutex controllables_lock; -- 2.30.2