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);