diff options
author | Carl Hetherington <carl@carlh.net> | 2010-07-08 22:55:20 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2010-07-08 22:55:20 +0000 |
commit | 648a169d8ff9987ba727e9ba50af4f33da6db165 (patch) | |
tree | d8e250205004633a9f5c94e15e8f3826fac183b6 /libs/midi++2 | |
parent | 3549189f87813b8c9f01f2f6484b34cf923a65ad (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.cc | 35 | ||||
-rw-r--r-- | libs/midi++2/midi++/manager.h | 30 | ||||
-rw-r--r-- | libs/midi++2/midi++/mmc.h | 3 | ||||
-rw-r--r-- | libs/midi++2/midi++/port.h | 4 | ||||
-rw-r--r-- | libs/midi++2/mmc.cc | 6 | ||||
-rw-r--r-- | libs/midi++2/port.cc | 11 |
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) { |