summaryrefslogtreecommitdiff
path: root/libs/midi++2
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-07-08 22:55:20 +0000
committerCarl Hetherington <carl@carlh.net>2010-07-08 22:55:20 +0000
commit648a169d8ff9987ba727e9ba50af4f33da6db165 (patch)
treed8e250205004633a9f5c94e15e8f3826fac183b6 /libs/midi++2
parent3549189f87813b8c9f01f2f6484b34cf923a65ad (diff)
Move MIDI control port ownership into the MIDI Manager, since control port state should be Ardour-wide, not per-session. Fix up port connection state management.
git-svn-id: svn://localhost/ardour2/branches/3.0@7394 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/midi++2')
-rw-r--r--libs/midi++2/manager.cc35
-rw-r--r--libs/midi++2/midi++/manager.h30
-rw-r--r--libs/midi++2/midi++/mmc.h3
-rw-r--r--libs/midi++2/midi++/port.h4
-rw-r--r--libs/midi++2/mmc.cc6
-rw-r--r--libs/midi++2/port.cc11
6 files changed, 73 insertions, 16 deletions
diff --git a/libs/midi++2/manager.cc b/libs/midi++2/manager.cc
index c8094d4d4f..cab42d8d81 100644
--- a/libs/midi++2/manager.cc
+++ b/libs/midi++2/manager.cc
@@ -27,6 +27,7 @@
#include "midi++/manager.h"
#include "midi++/channel.h"
#include "midi++/port.h"
+#include "midi++/mmc.h"
using namespace std;
using namespace MIDI;
@@ -34,12 +35,23 @@ using namespace PBD;
Manager *Manager::theManager = 0;
-Manager::Manager ()
+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));
}
Manager::~Manager ()
{
+ delete _mmc;
+
+ /* This will delete our MTC etc. ports */
for (PortList::iterator p = _ports.begin(); p != _ports.end(); ++p) {
delete *p;
}
@@ -77,10 +89,10 @@ Manager::cycle_end()
/** Re-register ports that disappear on JACK shutdown */
void
-Manager::reestablish (void* a)
+Manager::reestablish (jack_client_t* jack)
{
for (PortList::const_iterator p = _ports.begin(); p != _ports.end(); ++p) {
- (*p)->reestablish (a);
+ (*p)->reestablish (jack);
}
}
@@ -107,3 +119,20 @@ Manager::port (string const & n)
return *p;
}
+
+void
+Manager::create (jack_client_t* jack)
+{
+ assert (theManager == 0);
+ theManager = new Manager (jack);
+}
+
+void
+Manager::set_port_states (list<XMLNode*> s)
+{
+ 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);
+ }
+ }
+}
diff --git a/libs/midi++2/midi++/manager.h b/libs/midi++2/midi++/manager.h
index 2193c1eb23..6ee9dbf68b 100644
--- a/libs/midi++2/midi++/manager.h
+++ b/libs/midi++2/midi++/manager.h
@@ -29,6 +29,8 @@
namespace MIDI {
+class MachineControl;
+
class Manager {
public:
~Manager ();
@@ -46,22 +48,32 @@ class Manager {
*/
void cycle_end();
+ MachineControl* mmc () const { return _mmc; }
+ Port *mtc_input_port() const { return _mtc_input_port; }
+ Port *mtc_output_port() const { return _mtc_output_port; }
+ Port *midi_input_port() const { return _midi_input_port; }
+ Port *midi_output_port() const { return _midi_output_port; }
+ Port *midi_clock_input_port() const { return _midi_clock_input_port; }
+ Port *midi_clock_output_port() const { return _midi_clock_output_port; }
+
Port* add_port (Port *);
Port* port (std::string const &);
+ void set_port_states (std::list<XMLNode*>);
+
typedef std::list<Port *> PortList;
const PortList& get_midi_ports() const { return _ports; }
+ static void create (jack_client_t* jack);
+
static Manager *instance () {
- if (theManager == 0) {
- theManager = new Manager;
- }
+ assert (theManager);
return theManager;
}
- void reestablish (void *);
+ void reestablish (jack_client_t *);
void reconnect ();
PBD::Signal0<void> PortsChanged;
@@ -69,8 +81,16 @@ class Manager {
private:
/* This is a SINGLETON pattern */
- Manager ();
+ Manager (jack_client_t *);
static Manager *theManager;
+
+ MIDI::MachineControl* _mmc;
+ MIDI::Port* _mtc_input_port;
+ MIDI::Port* _mtc_output_port;
+ MIDI::Port* _midi_input_port;
+ MIDI::Port* _midi_output_port;
+ MIDI::Port* _midi_clock_input_port;
+ MIDI::Port* _midi_clock_output_port;
std::list<Port*> _ports;
};
diff --git a/libs/midi++2/midi++/mmc.h b/libs/midi++2/midi++/mmc.h
index ec3eb8bbb1..20063c3e91 100644
--- a/libs/midi++2/midi++/mmc.h
+++ b/libs/midi++2/midi++/mmc.h
@@ -32,6 +32,7 @@ namespace MIDI {
class Port;
class Parser;
class MachineControlCommand;
+class Manager;
/** Class to handle incoming and outgoing MIDI machine control messages */
class MachineControl
@@ -88,7 +89,7 @@ class MachineControl
cmdResume = 0x7F
};
- MachineControl (jack_client_t *);
+ MachineControl (Manager *, jack_client_t *);
Port* output_port() { return _output_port; }
diff --git a/libs/midi++2/midi++/port.h b/libs/midi++2/midi++/port.h
index 6d1191866b..d0b6249ebe 100644
--- a/libs/midi++2/midi++/port.h
+++ b/libs/midi++2/midi++/port.h
@@ -126,12 +126,14 @@ class Port {
nframes_t nframes_this_cycle() const { return _nframes_this_cycle; }
- void reestablish (void *);
+ void reestablish (jack_client_t *);
void reconnect ();
static void set_process_thread (pthread_t);
static pthread_t get_process_thread () { return _process_thread; }
static bool is_process_thread();
+
+ static std::string state_node_name;
static PBD::Signal0<void> MakeConnections;
static PBD::Signal0<void> JackHalted;
diff --git a/libs/midi++2/mmc.cc b/libs/midi++2/mmc.cc
index 69bdabf1e5..930666a027 100644
--- a/libs/midi++2/mmc.cc
+++ b/libs/midi++2/mmc.cc
@@ -195,15 +195,15 @@ static void build_mmc_cmd_map ()
}
-MachineControl::MachineControl (jack_client_t* jack)
+MachineControl::MachineControl (Manager* m, jack_client_t* jack)
{
build_mmc_cmd_map ();
_receive_device_id = 0;
_send_device_id = 0x7f;
- _input_port = Manager::instance()->add_port (new Port ("MMC in", Port::IsInput, jack));
- _output_port = Manager::instance()->add_port (new Port ("MMC out", Port::IsOutput, jack));
+ _input_port = m->add_port (new Port ("MMC in", Port::IsInput, jack));
+ _output_port = m->add_port (new Port ("MMC out", Port::IsOutput, jack));
_input_port->parser()->mmc.connect_same_thread (port_connections, boost::bind (&MachineControl::process_mmc_message, this, _1, _2, _3));
_input_port->parser()->start.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_start, this, _1, _2));
diff --git a/libs/midi++2/port.cc b/libs/midi++2/port.cc
index a6097c89dc..65cba24eb0 100644
--- a/libs/midi++2/port.cc
+++ b/libs/midi++2/port.cc
@@ -42,6 +42,7 @@ using namespace PBD;
pthread_t Port::_process_thread;
Signal0<void> Port::JackHalted;
Signal0<void> Port::MakeConnections;
+string Port::state_node_name = "MIDI-port";
Port::Port (string const & name, Flags flags, jack_client_t* jack_client)
: _currently_in_cycle (false)
@@ -406,7 +407,7 @@ Port::create_port ()
XMLNode&
Port::get_state () const
{
- XMLNode* root = new XMLNode ("MIDI-port");
+ XMLNode* root = new XMLNode (state_node_name);
root->add_property ("tag", _tagname);
if (_flags == IsInput) {
@@ -459,6 +460,10 @@ Port::set_state (const XMLNode& node)
{
const XMLProperty* prop;
+ if ((prop = node.property ("tag")) == 0 || prop->value() != _tagname) {
+ return;
+ }
+
if ((prop = node.property ("connections")) != 0 && _jack_port) {
_connections = prop->value ();
}
@@ -498,9 +503,9 @@ Port::is_process_thread()
}
void
-Port::reestablish (void* jack)
+Port::reestablish (jack_client_t* jack)
{
- _jack_client = static_cast<jack_client_t*> (jack);
+ _jack_client = jack;
int const r = create_port ();
if (r) {