fix thinko in AudioEngine::get_port_by_name()
[ardour.git] / libs / midi++2 / manager.cc
index 5c464fa060a6c2142a1259155015430ee72869c7..d4b9b00715fe525f8ef672fc1573ecc71cbfd357 100644 (file)
 #include "midi++/manager.h"
 #include "midi++/channel.h"
 #include "midi++/port.h"
+#include "midi++/mmc.h"
 
 using namespace std;
 using namespace MIDI;
 using namespace PBD;
 
-/* XXX check for strdup leaks */
-
 Manager *Manager::theManager = 0;
 
-Manager::Manager () 
+Manager::Manager (jack_client_t* jack
 {
-       inputPort = 0;
-       outputPort = 0;
-       inputChannelNumber = 0;
-       outputChannelNumber = 0;
-       api_data = 0;
+       _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));
 }
 
 Manager::~Manager ()
 {
+       delete _mmc;
+       
+       /* This will delete our MTC etc. ports */
        for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
                delete *p;
        }
@@ -57,176 +62,77 @@ Manager::~Manager ()
 }
 
 Port *
-Manager::add_port (const XMLNode& node)
+Manager::add_port (Port* p)
 {
-       Port::Descriptor desc (node);
-       Port *port;
-       PortList::iterator p;
-
-       for (p = _ports.begin(); p != _ports.end(); ++p) {
-
-               if (desc.tag == (*p)->name()) {
-                       break;
-               }
-               
-       }
-
-       if (p != _ports.end()) {
-               return 0;
-       }
-       
-       port = new Port (node, (jack_client_t *) api_data);
-       
-       if (port == 0) {
-               return 0;
-       }
-
-       if (!port->ok()) {
-               delete port;
-               return 0;
-       }
-
-       _ports.push_back (port);
-
-       /* first port added becomes the default input
-          port.
-       */
-
-       if (inputPort == 0) {
-               inputPort = port;
-       } 
-
-       if (outputPort == 0) {
-               outputPort = port;
-       }
+       _ports.push_back (p);
 
        PortsChanged (); /* EMIT SIGNAL */
 
-       return port;
+       return p;
 }
 
-int 
-Manager::remove_port (Port* port)
+void
+Manager::cycle_start (pframes_t nframes)
 {
-       if (inputPort == port) {
-               inputPort = 0;
-       }
-
-       if (outputPort == port) {
-               outputPort = 0;
+       for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
+               (*p)->cycle_start (nframes);
        }
-
-       _ports.remove (port);
-       delete port;
-
-       PortsChanged (); /* EMIT SIGNAL */
-
-       return 0;
 }
 
-int
-Manager::set_input_port (string tag)
+void
+Manager::cycle_end()
 {
        for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
-               if ((*p)->name() == tag) {
-                       inputPort = (*p);
-                       return 0;
-               }
+               (*p)->cycle_end ();
        }
-
-       return -1;
 }
 
-int
-Manager::set_output_port (string tag)
+/** Re-register ports that disappear on JACK shutdown */
+void
+Manager::reestablish (jack_client_t* jack)
 {
-       PortList::iterator p;
-
-       for (p = _ports.begin(); p != _ports.end(); ++p) {
-               if ((*p)->name() == tag) {
-                       inputPort = (*p);
-                       break;
-               }
-       }
-
-       if (p == _ports.end()) {
-               return -1;
-       }
-
-       // XXX send a signal to say we're about to change output ports
-
-       if (outputPort) {
-               for (channel_t chan = 0; chan < 16; chan++) {
-                       outputPort->channel (chan)->all_notes_off (0);
-               }
+       for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p) {
+               (*p)->reestablish (jack);
        }
-       
-       outputPort = (*p);
-
-       // XXX send a signal to say we've changed output ports
-
-       return 0;
 }
 
-Port *
-Manager::port (string name)
+/** Re-connect ports after a reestablish () */
+void
+Manager::reconnect ()
 {
-       for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
-               if (name == (*p)->name()) {
-                       return (*p);
-               }
+       for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p) {
+               (*p)->reconnect ();
        }
-
-       return 0;
 }
 
-int
-Manager::foreach_port (int (*func)(const Port &, size_t, void *),
-                          void *arg)
+Port*
+Manager::port (string const & n)
 {
-       int n = 0;
-               
-       for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p, ++n) {
-               int retval;
-
-               if ((retval = func (**p, n, arg)) != 0) {
-                       return retval;
-               }
+       PortList::const_iterator p = _ports.begin();
+       while (p != _ports.end() && (*p)->name() != n) {
+               ++p;
        }
 
-       return 0;
-}
-
-void
-Manager::cycle_start(nframes_t nframes)
-{
-       for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
-               (*p)->cycle_start (nframes);
+       if (p == _ports.end()) {
+               return 0;
        }
-}
 
-void
-Manager::cycle_end()
-{
-       for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
-               (*p)->cycle_end ();
-       }
+       return *p;
 }
 
-/** Re-register ports that disappear on JACK shutdown */
 void
-Manager::reestablish (void* a)
+Manager::create (jack_client_t* jack)
 {
-       for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p) {
-               (*p)->reestablish (a);
-       }
+       assert (theManager == 0);
+       theManager = new Manager (jack);
 }
 
-/** Re-connect ports after a reestablish () */
 void
-Manager::reconnect ()
+Manager::set_port_states (list<XMLNode*> s)
 {
-       for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p) {
-               (*p)->reconnect ();
+       for (list<XMLNode*>::iterator i = s.begin(); i != s.end(); ++i) {
+               for (PortList::const_iterator j = _ports.begin(); j != _ports.end(); ++j) {
+                       (*j)->set_state (**i);
+               }
        }
 }