2 Copyright (C) 1998-99 Paul Barton-Davis
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2 of the License, or
6 (at your option) any later version.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "pbd/error.h"
26 #include "midi++/types.h"
27 #include "midi++/manager.h"
28 #include "midi++/channel.h"
29 #include "midi++/port.h"
30 #include "midi++/jack_midi_port.h"
31 #include "midi++/mmc.h"
37 Manager *Manager::theManager = 0;
39 Manager::Manager (jack_client_t* jack)
40 : _ports (new PortList)
42 _mmc = new MachineControl (this, jack);
44 _mtc_input_port = add_port (new MIDI::JackMIDIPort ("MTC in", Port::IsInput, jack));
45 _mtc_output_port = add_port (new MIDI::JackMIDIPort ("MTC out", Port::IsOutput, jack));
46 _midi_input_port = add_port (new MIDI::JackMIDIPort ("MIDI control in", Port::IsInput, jack));
47 _midi_output_port = add_port (new MIDI::JackMIDIPort ("MIDI control out", Port::IsOutput, jack));
48 _midi_clock_input_port = add_port (new MIDI::JackMIDIPort ("MIDI clock in", Port::IsInput, jack));
49 _midi_clock_output_port = add_port (new MIDI::JackMIDIPort ("MIDI clock out", Port::IsOutput, jack));
56 /* This will delete our MTC etc. ports */
58 boost::shared_ptr<PortList> pr = _ports.reader ();
59 for (PortList::iterator p = pr->begin(); p != pr->end(); ++p) {
63 if (theManager == this) {
69 Manager::add_port (Port* p)
72 RCUWriter<PortList> writer (_ports);
73 boost::shared_ptr<PortList> pw = writer.get_copy ();
77 PortsChanged (); /* EMIT SIGNAL */
83 Manager::remove_port (Port* p)
86 RCUWriter<PortList> writer (_ports);
87 boost::shared_ptr<PortList> pw = writer.get_copy ();
91 PortsChanged (); /* EMIT SIGNAL */
95 Manager::cycle_start (pframes_t nframes)
97 boost::shared_ptr<PortList> pr = _ports.reader ();
99 for (PortList::iterator p = pr->begin(); p != pr->end(); ++p) {
100 (*p)->cycle_start (nframes);
107 boost::shared_ptr<PortList> pr = _ports.reader ();
109 for (PortList::iterator p = pr->begin(); p != pr->end(); ++p) {
114 /** Re-register ports that disappear on JACK shutdown */
116 Manager::reestablish (jack_client_t* jack)
118 boost::shared_ptr<PortList> pr = _ports.reader ();
120 for (PortList::const_iterator p = pr->begin(); p != pr->end(); ++p) {
121 JackMIDIPort* pp = dynamic_cast<JackMIDIPort*> (*p);
123 pp->reestablish (jack);
128 /** Re-connect ports after a reestablish () */
130 Manager::reconnect ()
132 boost::shared_ptr<PortList> pr = _ports.reader ();
134 for (PortList::const_iterator p = pr->begin(); p != pr->end(); ++p) {
135 JackMIDIPort* pp = dynamic_cast<JackMIDIPort*> (*p);
143 Manager::port (string const & n)
145 boost::shared_ptr<PortList> pr = _ports.reader ();
147 PortList::const_iterator p = pr->begin();
148 while (p != pr->end() && (*p)->name() != n) {
152 if (p == pr->end()) {
160 Manager::create (jack_client_t* jack)
162 assert (theManager == 0);
163 theManager = new Manager (jack);
167 Manager::set_port_states (list<XMLNode*> s)
169 boost::shared_ptr<PortList> pr = _ports.reader ();
171 for (list<XMLNode*>::iterator i = s.begin(); i != s.end(); ++i) {
172 for (PortList::const_iterator j = pr->begin(); j != pr->end(); ++j) {
173 (*j)->set_state (**i);