diff options
Diffstat (limited to 'libs/surfaces/generic_midi')
-rw-r--r-- | libs/surfaces/generic_midi/SConscript | 9 | ||||
-rw-r--r-- | libs/surfaces/generic_midi/generic_midi_control_protocol.cc | 26 | ||||
-rw-r--r-- | libs/surfaces/generic_midi/generic_midi_control_protocol.h | 4 | ||||
-rw-r--r-- | libs/surfaces/generic_midi/interface.cc | 10 |
4 files changed, 39 insertions, 10 deletions
diff --git a/libs/surfaces/generic_midi/SConscript b/libs/surfaces/generic_midi/SConscript index abede3f4d7..51e0ff88c8 100644 --- a/libs/surfaces/generic_midi/SConscript +++ b/libs/surfaces/generic_midi/SConscript @@ -29,12 +29,13 @@ genericmidi.Append(CXXFLAGS="-DDATA_DIR=\\\""+final_prefix+"/share\\\"") genericmidi.Append(CXXFLAGS="-DCONFIG_DIR=\\\""+final_config_prefix+"\\\"") genericmidi.Append(CXXFLAGS="-DLOCALEDIR=\\\""+final_prefix+"/share/locale\\\"") +genericmidi.Append(CPPPATH=libraries['ardour'].get ('CPPPATH', [])) +genericmidi.Append(CPPPATH=libraries['sigc2'].get ('CPPPATH', [])) +genericmidi.Append(CPPPATH=libraries['pbd3'].get ('CPPPATH', [])) +genericmidi.Append(CPPPATH=libraries['midi++2'].get ('CPPPATH', [])) + genericmidi.Merge ([ libraries['usb'], - libraries['ardour'], - libraries['sigc2'], - libraries['pbd3'], - libraries['midi++2'], libraries['xml'] ]) diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index 4d64c6ce23..61a8b7974e 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -1,3 +1,5 @@ +#include <midi++/port.h> + #include <ardour/route.h> #include <ardour/session.h> @@ -10,13 +12,28 @@ using namespace ARDOUR; GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s) : ControlProtocol (s, _("GenericMIDI")) { - _port = 0; + _port = s.midi_port(); + s.MIDI_PortChanged.connect (mem_fun (*this, &GenericMidiControlProtocol::port_change)); + } GenericMidiControlProtocol::~GenericMidiControlProtocol () { } +int +GenericMidiControlProtocol::init () +{ + /* start delivery/outbound thread */ + return init_thread (); +} + +void +GenericMidiControlProtocol::port_change () +{ + _port = session.midi_port (); +} + void GenericMidiControlProtocol::set_port (MIDI::Port* p) { @@ -29,20 +46,19 @@ GenericMidiControlProtocol::send_route_feedback (list<Route*>& routes) if (_port != 0) { const int32_t bufsize = 16 * 1024; + MIDI::byte buf[bufsize]; int32_t bsize = bufsize; - MIDI::byte* buf = new MIDI::byte[bufsize]; MIDI::byte* end = buf; for (list<Route*>::iterator r = routes.begin(); r != routes.end(); ++r) { - end = (*r)->write_midi_feedback (end, bsize); + end = (*r)->write_midi_feedback (end, bsize); } if (end == buf) { - delete [] buf; return; } - session.deliver_midi (_port, buf, (int32_t) (end - buf)); + _port->write (buf, (int32_t) (end - buf)); //cerr << "MIDI feedback: wrote " << (int32_t) (end - buf) << " to midi port\n"; } } diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h index 75b514f016..54831b2982 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h @@ -14,6 +14,8 @@ class GenericMidiControlProtocol : public ControlProtocol { GenericMidiControlProtocol (Session&); virtual ~GenericMidiControlProtocol(); + int init (); + bool active() const; void set_port (MIDI::Port*); @@ -24,6 +26,8 @@ class GenericMidiControlProtocol : public ControlProtocol { private: void route_feedback (ARDOUR::Route&, bool); MIDI::Port* _port; + + void port_change (); }; } diff --git a/libs/surfaces/generic_midi/interface.cc b/libs/surfaces/generic_midi/interface.cc index 8283b92e6f..500d745deb 100644 --- a/libs/surfaces/generic_midi/interface.cc +++ b/libs/surfaces/generic_midi/interface.cc @@ -7,7 +7,14 @@ using namespace ARDOUR; ControlProtocol* new_generic_midi_protocol (ControlProtocolDescriptor* descriptor, Session* s) { - return new GenericMidiControlProtocol (*s); + GenericMidiControlProtocol* gmcp = new GenericMidiControlProtocol (*s); + + if (gmcp->init ()) { + delete gmcp; + return 0; + } + + return gmcp; } void @@ -18,6 +25,7 @@ delete_generic_midi_protocol (ControlProtocolDescriptor* descriptor, ControlProt static ControlProtocolDescriptor generic_midi_descriptor = { name : "Generic MIDI", + id : "uri://ardour.org/surfaces/generic_midi:0", ptr : 0, module : 0, initialize : new_generic_midi_protocol, |