summaryrefslogtreecommitdiff
path: root/libs/surfaces/mackie
diff options
context:
space:
mode:
Diffstat (limited to 'libs/surfaces/mackie')
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.cc34
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.h10
-rw-r--r--libs/surfaces/mackie/surface.cc7
-rw-r--r--libs/surfaces/mackie/surface_port.cc58
-rw-r--r--libs/surfaces/mackie/surface_port.h23
5 files changed, 72 insertions, 60 deletions
diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc
index 95ac0c3025..194e35a26f 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol.cc
@@ -392,7 +392,9 @@ MackieControlProtocol::set_active (bool yn)
BaseUI::run ();
- create_surfaces ();
+ if (create_surfaces ()) {
+ return -1;
+ }
connect_session_signals ();
_active = true;
update_surfaces ();
@@ -605,7 +607,7 @@ MackieControlProtocol::set_profile (const string& profile_name)
_device_profile = d->second;
}
-void
+int
MackieControlProtocol::set_device (const string& device_name, bool allow_activation)
{
map<string,DeviceInfo>::iterator d = DeviceInfo::device_info.find (device_name);
@@ -614,7 +616,7 @@ MackieControlProtocol::set_device (const string& device_name, bool allow_activat
device_name, allow_activation));
if (d == DeviceInfo::device_info.end()) {
- return;
+ return -1;
}
if (_active) {
@@ -628,13 +630,16 @@ MackieControlProtocol::set_device (const string& device_name, bool allow_activat
set_active (true);
} else {
if (_active) {
- create_surfaces ();
+ if (create_surfaces ()) {
+ return -1;
+ }
switch_banks (0, true);
}
}
+ return 0;
}
-void
+int
MackieControlProtocol::create_surfaces ()
{
string device_name;
@@ -651,7 +656,13 @@ MackieControlProtocol::create_surfaces ()
for (uint32_t n = 0; n < 1 + _device_info.extenders(); ++n) {
- boost::shared_ptr<Surface> surface (new Surface (*this, device_name, n, stype));
+ boost::shared_ptr<Surface> surface;
+
+ try {
+ surface.reset (new Surface (*this, device_name, n, stype));
+ } catch (...) {
+ return -1;
+ }
{
Glib::Threads::Mutex::Lock lm (surfaces_lock);
@@ -697,6 +708,8 @@ MackieControlProtocol::create_surfaces ()
g_source_ref (psrc->gobj());
}
}
+
+ return 0;
}
void
@@ -1237,7 +1250,7 @@ MackieControlProtocol::midi_input_handler (IOCondition ioc, MIDI::Port* port)
}
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("data available on %1\n", port->name()));
- framepos_t now = session->engine().frame_time();
+ framepos_t now = session->engine().sample_time();
port->parse (now);
}
@@ -1574,14 +1587,17 @@ MackieControlProtocol::set_ipmidi_base (int16_t portnum)
}
}
-void
+int
MackieControlProtocol::ipmidi_restart ()
{
clear_ports ();
clear_surfaces ();
- create_surfaces ();
+ if (create_surfaces ()) {
+ return -1;
+ }
switch_banks (_current_initial_bank, true);
needs_ipmidi_restart = false;
+ return 0;
}
void
diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h
index ffc06a32eb..4669247726 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.h
+++ b/libs/surfaces/mackie/mackie_control_protocol.h
@@ -120,8 +120,8 @@ class MackieControlProtocol
Mackie::DeviceProfile& device_profile() { return _device_profile; }
int set_active (bool yn);
- void set_device (const std::string&, bool allow_activation = true);
- void set_profile (const std::string&);
+ int set_device (const std::string&, bool allow_activation = true);
+ void set_profile (const std::string&);
FlipMode flip_mode () const { return _flip_mode; }
ViewMode view_mode () const { return _view_mode; }
@@ -291,7 +291,7 @@ class MackieControlProtocol
ARDOUR::RouteNotificationList _last_selected_routes;
- void create_surfaces ();
+ int create_surfaces ();
bool periodic();
void build_gui ();
bool midi_input_handler (Glib::IOCondition ioc, MIDI::Port* port);
@@ -301,8 +301,8 @@ class MackieControlProtocol
void build_button_map ();
void gui_track_selection_changed (ARDOUR::RouteNotificationListPtr, bool save_list);
void _gui_track_selection_changed (ARDOUR::RouteNotificationList*, bool save_list);
- void ipmidi_restart ();
- void initialize ();
+ int ipmidi_restart ();
+ void initialize ();
/* BUTTON HANDLING */
diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc
index 0c45a29378..507491d84c 100644
--- a/libs/surfaces/mackie/surface.cc
+++ b/libs/surfaces/mackie/surface.cc
@@ -24,7 +24,6 @@
#include <cmath>
#include "midi++/port.h"
-#include "midi++/manager.h"
#include "ardour/automation_control.h"
#include "ardour/debug.h"
@@ -87,7 +86,11 @@ Surface::Surface (MackieControlProtocol& mcp, const std::string& device_name, ui
{
DEBUG_TRACE (DEBUG::MackieControl, "Surface::Surface init\n");
- _port = new SurfacePort (*this);
+ try {
+ _port = new SurfacePort (*this);
+ } catch (...) {
+ throw failed_constructor ();
+ }
/* only the first Surface object has global controls */
diff --git a/libs/surfaces/mackie/surface_port.cc b/libs/surfaces/mackie/surface_port.cc
index 9f52f0dccd..508f501f59 100644
--- a/libs/surfaces/mackie/surface_port.cc
+++ b/libs/surfaces/mackie/surface_port.cc
@@ -23,60 +23,48 @@
#include <sigc++/sigc++.h>
#include <boost/shared_array.hpp>
+#include "pbd/failed_constructor.h"
+
#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/async_midi_port.h"
#include "ardour/debug.h"
#include "ardour/rc_configuration.h"
#include "ardour/session.h"
#include "ardour/audioengine.h"
+#include "ardour/async_midi_port.h"
+#include "ardour/midiport_manager.h"
#include "controls.h"
#include "mackie_control_protocol.h"
#include "surface.h"
#include "surface_port.h"
-
#include "i18n.h"
using namespace std;
using namespace Mackie;
using namespace PBD;
+using namespace ARDOUR;
-/** @param input_port Input MIDI::Port; this object takes responsibility for
- * adding & removing it from the MIDI::Manager and destroying it. @param
- * output_port Output MIDI::Port; responsibility similarly taken.
- */
SurfacePort::SurfacePort (Surface& s)
: _surface (&s)
- , _input_port (0)
- , _output_port (0)
{
+
if (_surface->mcp().device_info().uses_ipmidi()) {
_input_port = new MIDI::IPMIDIPort (_surface->mcp().ipmidi_base() +_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);
+ _async_in = AudioEngine::instance()->register_input_port (DataType::MIDI, string_compose (_("%1 in"), _surface->name()), true);
+ _async_out = AudioEngine::instance()->register_output_port (DataType::MIDI, string_compose (_("%1 out"), _surface->name()), true);
+
+ if (_async_in == 0 || _async_out == 0) {
+ throw failed_constructor();
+ }
+
+ _input_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_in).get();
+ _output_port = boost::dynamic_pointer_cast<AsyncMIDIPort>(_async_out).get();
}
}
@@ -86,17 +74,15 @@ SurfacePort::~SurfacePort()
delete _input_port;
} else {
- MIDI::Manager* mm = MIDI::Manager::instance ();
-
- if (_input_port) {
- mm->remove_port (_input_port);
- delete _input_port;
+ if (_async_in) {
+ AudioEngine::instance()->unregister_port (_async_in);
+ _async_in.reset ();
}
- if (_output_port) {
+ if (_async_out) {
_output_port->drain (10000);
- mm->remove_port (_output_port);
- delete _output_port;
+ AudioEngine::instance()->unregister_port (_async_out);
+ _async_out.reset ();
}
}
}
diff --git a/libs/surfaces/mackie/surface_port.h b/libs/surfaces/mackie/surface_port.h
index 7dc20a06f2..751ee848d7 100644
--- a/libs/surfaces/mackie/surface_port.h
+++ b/libs/surfaces/mackie/surface_port.h
@@ -21,16 +21,23 @@
#include <midi++/types.h>
#include "pbd/signals.h"
+
+
#include "midi_byte_array.h"
#include "types.h"
namespace MIDI {
- class Port;
class Parser;
+ class Port;
}
class MackieControlProtocol;
+namespace ARDOUR {
+ class AsyncMIDIPort;
+ class Port;
+}
+
namespace Mackie
{
@@ -49,17 +56,17 @@ public:
/// an easier way to output bytes via midi
int write (const MidiByteArray&);
- MIDI::Port& input_port() { return *_input_port; }
- const MIDI::Port& input_port() const { return *_input_port; }
- MIDI::Port& output_port() { return *_output_port; }
- const MIDI::Port& output_port() const { return *_output_port; }
+ MIDI::Port& input_port() const { return *_input_port; }
+ MIDI::Port& output_port() const { return *_output_port; }
protected:
private:
- Mackie::Surface* _surface;
- MIDI::Port* _input_port;
- MIDI::Port* _output_port;
+ Mackie::Surface* _surface;
+ MIDI::Port* _input_port;
+ MIDI::Port* _output_port;
+ boost::shared_ptr<ARDOUR::Port> _async_in;
+ boost::shared_ptr<ARDOUR::Port> _async_out;
};
std::ostream& operator << (std::ostream& , const SurfacePort& port);