summaryrefslogtreecommitdiff
path: root/libs/surfaces/mackie
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2012-04-24 02:28:51 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2012-04-24 02:28:51 +0000
commit33140f32671576a285d62f529447f941f96313fc (patch)
tree44faee5b21e3181077d0c22180895fb072432a53 /libs/surfaces/mackie
parent10d37fecc1b54487a5fb0f3652bfb45a5224ef8b (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.cc13
-rw-r--r--libs/surfaces/mackie/device_info.h2
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.cc34
-rw-r--r--libs/surfaces/mackie/surface.cc3
-rw-r--r--libs/surfaces/mackie/surface_port.cc65
-rw-r--r--libs/surfaces/mackie/surface_port.h4
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);