Fix up tests now that operator= on ScopedConnection disconnects the old connection...
[ardour.git] / libs / midi++2 / manager.cc
index b411a1ddad9b67c3c64c5b88f5bdbf3feb2d4c6a..822c74e1254ae1d5d48daebfe59345c78d3807d4 100644 (file)
@@ -27,6 +27,7 @@
 #include "midi++/manager.h"
 #include "midi++/channel.h"
 #include "midi++/port.h"
+#include "midi++/jack_midi_port.h"
 #include "midi++/mmc.h"
 
 using namespace std;
@@ -40,12 +41,12 @@ Manager::Manager (jack_client_t* jack)
 {
        _mmc = new MachineControl (this, jack);
        
-       _mtc_input_port = add_port (new MIDI::Port ("MTC in", Port::IsInput, jack));
-       _mtc_output_port = add_port (new MIDI::Port ("MTC out", Port::IsOutput, jack));
-       _midi_input_port = add_port (new MIDI::Port ("MIDI control in", Port::IsInput, jack));
-       _midi_output_port = add_port (new MIDI::Port ("MIDI control out", Port::IsOutput, jack));
-       _midi_clock_input_port = add_port (new MIDI::Port ("MIDI clock in", Port::IsInput, jack));
-       _midi_clock_output_port = add_port (new MIDI::Port ("MIDI clock out", Port::IsOutput, jack));
+       _mtc_input_port = add_port (new MIDI::JackMIDIPort ("MTC in", Port::IsInput, jack));
+       _mtc_output_port = add_port (new MIDI::JackMIDIPort ("MTC out", Port::IsOutput, jack));
+       _midi_input_port = add_port (new MIDI::JackMIDIPort ("MIDI control in", Port::IsInput, jack));
+       _midi_output_port = add_port (new MIDI::JackMIDIPort ("MIDI control out", Port::IsOutput, jack));
+       _midi_clock_input_port = add_port (new MIDI::JackMIDIPort ("MIDI clock in", Port::IsInput, jack));
+       _midi_clock_output_port = add_port (new MIDI::JackMIDIPort ("MIDI clock out", Port::IsOutput, jack));
 }
 
 Manager::~Manager ()
@@ -67,9 +68,11 @@ Manager::~Manager ()
 Port *
 Manager::add_port (Port* p)
 {
-       RCUWriter<PortList> writer (_ports);
-       boost::shared_ptr<PortList> pw = writer.get_copy ();
-       pw->push_back (p);
+       {
+               RCUWriter<PortList> writer (_ports);
+               boost::shared_ptr<PortList> pw = writer.get_copy ();
+               pw->push_back (p);
+       }
 
        PortsChanged (); /* EMIT SIGNAL */
 
@@ -79,9 +82,11 @@ Manager::add_port (Port* p)
 void
 Manager::remove_port (Port* p)
 {
-       RCUWriter<PortList> writer (_ports);
-       boost::shared_ptr<PortList> pw = writer.get_copy ();
-       pw->remove (p);
+       {
+               RCUWriter<PortList> writer (_ports);
+               boost::shared_ptr<PortList> pw = writer.get_copy ();
+               pw->remove (p);
+       }
 
        PortsChanged (); /* EMIT SIGNAL */
 }
@@ -113,7 +118,10 @@ Manager::reestablish (jack_client_t* jack)
        boost::shared_ptr<PortList> pr = _ports.reader ();
 
        for (PortList::const_iterator p = pr->begin(); p != pr->end(); ++p) {
-               (*p)->reestablish (jack);
+               JackMIDIPort* pp = dynamic_cast<JackMIDIPort*> (*p);
+               if (pp) {
+                       pp->reestablish (jack);
+               }
        }
 }
 
@@ -124,7 +132,10 @@ Manager::reconnect ()
        boost::shared_ptr<PortList> pr = _ports.reader ();
 
        for (PortList::const_iterator p = pr->begin(); p != pr->end(); ++p) {
-               (*p)->reconnect ();
+               JackMIDIPort* pp = dynamic_cast<JackMIDIPort*> (*p);
+               if (pp) {
+                       pp->reconnect ();
+               }
        }
 }
 
@@ -163,3 +174,10 @@ Manager::set_port_states (list<XMLNode*> s)
                }
        }
 }
+
+void
+Manager::destroy ()
+{
+       delete theManager;
+       theManager = 0;
+}