diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-04-24 02:28:51 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-04-24 02:28:51 +0000 |
commit | 33140f32671576a285d62f529447f941f96313fc (patch) | |
tree | 44faee5b21e3181077d0c22180895fb072432a53 /libs/surfaces/mackie | |
parent | 10d37fecc1b54487a5fb0f3652bfb45a5224ef8b (diff) |
add support for IP MIDI (multicast MIDI over IP UDP sockets) to ardour and use it if requested inside MCP code. required renaming the pre-existing MIDI::Port as MIDI:JackMIDIPort - MIDI::Port becomes the base type for both JackMIDIPort and IPMIDIPort
git-svn-id: svn://localhost/ardour2/branches/3.0@12069 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/surfaces/mackie')
-rw-r--r-- | libs/surfaces/mackie/device_info.cc | 13 | ||||
-rw-r--r-- | libs/surfaces/mackie/device_info.h | 2 | ||||
-rw-r--r-- | libs/surfaces/mackie/mackie_control_protocol.cc | 34 | ||||
-rw-r--r-- | libs/surfaces/mackie/surface.cc | 3 | ||||
-rw-r--r-- | libs/surfaces/mackie/surface_port.cc | 65 | ||||
-rw-r--r-- | libs/surfaces/mackie/surface_port.h | 4 |
6 files changed, 76 insertions, 45 deletions
diff --git a/libs/surfaces/mackie/device_info.cc b/libs/surfaces/mackie/device_info.cc index 4df56d3a7a..93800aa43b 100644 --- a/libs/surfaces/mackie/device_info.cc +++ b/libs/surfaces/mackie/device_info.cc @@ -50,6 +50,7 @@ DeviceInfo::DeviceInfo() , _has_jog_wheel (true) , _has_touch_sense_faders (true) , _uses_logic_control_buttons (false) + , _uses_ipmidi (false) , _name (X_("Mackie Control Universal Pro")) { mackie_control_buttons (); @@ -267,6 +268,12 @@ DeviceInfo::set_state (const XMLNode& node, int /* version */) } } + if ((child = node.child ("UsesIPMIDI")) != 0) { + if ((prop = child->property ("value")) != 0) { + _uses_ipmidi = string_is_affirmative (prop->value()); + } + } + if ((child = node.child ("LogicControlButtons")) != 0) { if ((prop = child->property ("value")) != 0) { _uses_logic_control_buttons = string_is_affirmative (prop->value()); @@ -370,6 +377,12 @@ DeviceInfo::has_timecode_display () const } bool +DeviceInfo::uses_ipmidi () const +{ + return _uses_ipmidi; +} + +bool DeviceInfo::has_global_controls () const { return _has_global_controls; diff --git a/libs/surfaces/mackie/device_info.h b/libs/surfaces/mackie/device_info.h index b08616db45..4071fcffc7 100644 --- a/libs/surfaces/mackie/device_info.h +++ b/libs/surfaces/mackie/device_info.h @@ -67,6 +67,7 @@ class DeviceInfo bool has_global_controls() const; bool has_jog_wheel () const; bool has_touch_sense_faders() const; + bool uses_ipmidi() const; const std::string& name() const; static std::map<std::string,DeviceInfo> device_info; @@ -86,6 +87,7 @@ class DeviceInfo bool _has_jog_wheel; bool _has_touch_sense_faders; bool _uses_logic_control_buttons; + bool _uses_ipmidi; std::string _name; std::map<Button::ID,GlobalButtonInfo> _global_buttons; diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc index 2608ec4879..83c4399943 100644 --- a/libs/surfaces/mackie/mackie_control_protocol.cc +++ b/libs/surfaces/mackie/mackie_control_protocol.cc @@ -114,7 +114,7 @@ MackieControlProtocol::MackieControlProtocol (Session& session) set_device (Config->get_mackie_device_name()); set_profile (Config->get_mackie_device_profile()); - + TrackSelectionChanged.connect (gui_connections, MISSING_INVALIDATOR, ui_bind (&MackieControlProtocol::gui_track_selection_changed, this, _1), this); _instance = this; @@ -128,6 +128,10 @@ MackieControlProtocol::~MackieControlProtocol() _active = false; + /* stop event loop */ + + BaseUI::quit (); + try { close(); } @@ -584,21 +588,23 @@ MackieControlProtocol::create_surfaces () } stype = ext; - _input_bundle->add_channel ( - surface->port().input_port().name(), - ARDOUR::DataType::MIDI, - session->engine().make_port_name_non_relative (surface->port().input_port().name()) - ); - - _output_bundle->add_channel ( - surface->port().output_port().name(), - ARDOUR::DataType::MIDI, - session->engine().make_port_name_non_relative (surface->port().output_port().name()) - ); + if (!_device_info.uses_ipmidi()) { + _input_bundle->add_channel ( + surface->port().input_port().name(), + ARDOUR::DataType::MIDI, + session->engine().make_port_name_non_relative (surface->port().input_port().name()) + ); + + _output_bundle->add_channel ( + surface->port().output_port().name(), + ARDOUR::DataType::MIDI, + session->engine().make_port_name_non_relative (surface->port().output_port().name()) + ); + } int fd; MIDI::Port& input_port (surface->port().input_port()); - + if ((fd = input_port.selectable ()) >= 0) { Glib::RefPtr<IOSource> psrc = IOSource::create (fd, IO_IN|IO_HUP|IO_ERR); @@ -1083,8 +1089,6 @@ MackieControlProtocol::midi_input_handler (IOCondition ioc, MIDI::Port* port) if (ioc & IO_IN) { - CrossThreadChannel::drain (port->selectable()); - DEBUG_TRACE (DEBUG::MidiIO, string_compose ("data available on %1\n", port->name())); framepos_t now = session->engine().frame_time(); port->parse (now); diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc index 5c6eb6d559..e08ba24a9e 100644 --- a/libs/surfaces/mackie/surface.cc +++ b/libs/surfaces/mackie/surface.cc @@ -109,8 +109,7 @@ Surface::~Surface () } delete _jog_wheel; - - /* don't delete the port, because we want its output to remain queued */ + delete _port; } const MidiByteArray& diff --git a/libs/surfaces/mackie/surface_port.cc b/libs/surfaces/mackie/surface_port.cc index be080fa44b..645da67b43 100644 --- a/libs/surfaces/mackie/surface_port.cc +++ b/libs/surfaces/mackie/surface_port.cc @@ -25,6 +25,8 @@ #include "midi++/types.h" #include "midi++/port.h" +#include "midi++/jack_midi_port.h" +#include "midi++/ipmidi_port.h" #include "midi++/manager.h" #include "ardour/debug.h" @@ -51,38 +53,49 @@ using namespace PBD; SurfacePort::SurfacePort (Surface& s) : _surface (&s) { - jack_client_t* jack = MackieControlProtocol::instance()->get_session().engine().jack(); - - _input_port = new MIDI::Port (string_compose (_("%1 in"), _surface->name()), MIDI::Port::IsInput, jack); - _output_port =new MIDI::Port (string_compose (_("%1 out"), _surface->name()), MIDI::Port::IsOutput, jack); - - /* MackieControl has its own thread for handling input from the input - * port, and we don't want anything handling output from the output - * port. This stops the Generic MIDI UI event loop in ardour from - * attempting to handle these ports. - */ - - _input_port->set_centrally_parsed (false); - _output_port->set_centrally_parsed (false); - - MIDI::Manager * mm = MIDI::Manager::instance(); - - mm->add_port (_input_port); - mm->add_port (_output_port); + if (_surface->mcp().device_info().uses_ipmidi()) { + _input_port = new MIDI::IPMIDIPort (MIDI::IPMIDIPort::lowest_ipmidi_port_default+_surface->number()); + _output_port = _input_port; + } else { + jack_client_t* jack = MackieControlProtocol::instance()->get_session().engine().jack(); + + _input_port = new MIDI::JackMIDIPort (string_compose (_("%1 in"), _surface->name()), MIDI::Port::IsInput, jack); + _output_port =new MIDI::JackMIDIPort (string_compose (_("%1 out"), _surface->name()), MIDI::Port::IsOutput, jack); + + /* MackieControl has its own thread for handling input from the input + * port, and we don't want anything handling output from the output + * port. This stops the Generic MIDI UI event loop in ardour from + * attempting to handle these ports. + */ + + _input_port->set_centrally_parsed (false); + _output_port->set_centrally_parsed (false); + + MIDI::Manager * mm = MIDI::Manager::instance(); + + mm->add_port (_input_port); + mm->add_port (_output_port); + } } SurfacePort::~SurfacePort() { - MIDI::Manager* mm = MIDI::Manager::instance (); - - if (_input_port) { - mm->remove_port (_input_port); + if (_surface->mcp().device_info().uses_ipmidi()) { delete _input_port; - } + } else { - if (_output_port) { - mm->remove_port (_output_port); - delete _output_port; + MIDI::Manager* mm = MIDI::Manager::instance (); + + if (_input_port) { + mm->remove_port (_input_port); + delete _input_port; + } + + if (_output_port) { + _output_port->drain (10000); + mm->remove_port (_output_port); + delete _output_port; + } } } diff --git a/libs/surfaces/mackie/surface_port.h b/libs/surfaces/mackie/surface_port.h index 1a65d8dbcf..70b1df4580 100644 --- a/libs/surfaces/mackie/surface_port.h +++ b/libs/surfaces/mackie/surface_port.h @@ -59,8 +59,8 @@ protected: private: Mackie::Surface* _surface; - MIDI::Port* _input_port; - MIDI::Port* _output_port; + MIDI::Port* _input_port; + MIDI::Port* _output_port; }; std::ostream& operator << (std::ostream& , const SurfacePort& port); |