a more reliable/robust/less complex version of previous commit
[ardour.git] / libs / surfaces / generic_midi / generic_midi_control_protocol.cc
index e319f65e1f8e0d1d6fc1488b9cc270dfb34b0b3d..d14a9ca24cac00bfae61d4c743dce1b4b7904d58 100644 (file)
@@ -25,7 +25,6 @@
 #include <glibmm/fileutils.h>
 #include <glibmm/miscutils.h>
 
-#include "pbd/controllable_descriptor.h"
 #include "pbd/error.h"
 #include "pbd/failed_constructor.h"
 #include "pbd/file_utils.h"
@@ -37,9 +36,9 @@
 #include "ardour/async_midi_port.h"
 #include "ardour/audioengine.h"
 #include "ardour/audioengine.h"
+#include "ardour/controllable_descriptor.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/session.h"
-#include "ardour/route.h"
 #include "ardour/midi_ui.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/midiport_manager.h"
@@ -54,7 +53,7 @@ using namespace ARDOUR;
 using namespace PBD;
 using namespace std;
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #define midi_ui_context() MidiControlUI::instance() /* a UICallback-derived object that specifies the event loop for signal handling */
 
@@ -95,7 +94,7 @@ GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s)
 
        /* this one is cross-thread */
 
-       Route::RemoteControlIDChange.connect (*this, MISSING_INVALIDATOR, boost::bind (&GenericMidiControlProtocol::reset_controllables, this), midi_ui_context());
+       PresentationInfo::Change.connect (*this, MISSING_INVALIDATOR, boost::bind (&GenericMidiControlProtocol::reset_controllables, this), midi_ui_context());
 
        /* Catch port connections and disconnections (cross-thread) */
        ARDOUR::AudioEngine::instance()->PortConnectedOrDisconnected.connect (port_connection, MISSING_INVALIDATOR,
@@ -168,7 +167,7 @@ GenericMidiControlProtocol::reload_maps ()
 
                MapInfo mi;
 
-               XMLProperty* prop = tree.root()->property ("name");
+               XMLProperty const * prop = tree.root()->property ("name");
 
                if (!prop) {
                        continue;
@@ -329,9 +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();
-                               delete (*i)->first;
+                       if (((*i)->mc)->get_controllable() == c) {
+                               if ((*i)->own_mc) {
+                                       delete (*i)->mc;
+                               }
+                               (*i)->connection.disconnect();
                                delete *i;
                                pending_controllables.erase (i);
                        }
@@ -340,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())) {
@@ -350,14 +352,14 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
 
        if (!mc) {
                mc = new MIDIControllable (this, *_input_port->parser(), *c, false);
+               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);
        }
@@ -377,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);
                }
@@ -401,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);