summaryrefslogtreecommitdiff
path: root/libs/surfaces
diff options
context:
space:
mode:
Diffstat (limited to 'libs/surfaces')
-rw-r--r--libs/surfaces/generic_midi/generic_midi_control_protocol.cc19
-rw-r--r--libs/surfaces/generic_midi/generic_midi_control_protocol.h18
-rw-r--r--libs/surfaces/generic_midi/midiaction.cc2
-rw-r--r--libs/surfaces/generic_midi/midiaction.h4
-rw-r--r--libs/surfaces/generic_midi/midicontrollable.cc38
-rw-r--r--libs/surfaces/generic_midi/midicontrollable.h15
-rw-r--r--libs/surfaces/generic_midi/midifunction.cc2
-rw-r--r--libs/surfaces/generic_midi/midifunction.h3
-rw-r--r--libs/surfaces/generic_midi/midiinvokable.cc22
-rw-r--r--libs/surfaces/generic_midi/midiinvokable.h7
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.cc40
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.h16
-rw-r--r--libs/surfaces/mackie/mcp_buttons.cc8
-rw-r--r--libs/surfaces/mackie/strip.cc12
-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
17 files changed, 147 insertions, 147 deletions
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
index 6da0192a8f..ba1858a174 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
@@ -32,13 +32,14 @@
#include "pbd/xml++.h"
#include "midi++/port.h"
-#include "midi++/manager.h"
+#include "ardour/audioengine.h"
#include "ardour/filesystem_paths.h"
#include "ardour/session.h"
#include "ardour/route.h"
#include "ardour/midi_ui.h"
#include "ardour/rc_configuration.h"
+#include "ardour/midiport_manager.h"
#include "generic_midi_control_protocol.h"
#include "midicontrollable.h"
@@ -59,8 +60,8 @@ GenericMidiControlProtocol::GenericMidiControlProtocol (Session& s)
, _threshold (10)
, gui (0)
{
- _input_port = MIDI::Manager::instance()->midi_input_port ();
- _output_port = MIDI::Manager::instance()->midi_output_port ();
+ _input_port = s.midi_input_port ();
+ _output_port = s.midi_output_port ();
do_feedback = false;
_feedback_interval = 10000; // microseconds
@@ -338,7 +339,7 @@ GenericMidiControlProtocol::start_learning (Controllable* c)
}
if (!mc) {
- mc = new MIDIControllable (this, *_input_port, *c, false);
+ mc = new MIDIControllable (this, *_input_port->parser(), *c, false);
}
{
@@ -435,7 +436,7 @@ GenericMidiControlProtocol::create_binding (PBD::Controllable* control, int pos,
MIDI::byte value = control_number;
// Create a MIDIControllable
- MIDIControllable* mc = new MIDIControllable (this, *_input_port, *control, false);
+ MIDIControllable* mc = new MIDIControllable (this, *_input_port->parser(), *control, false);
// Remove any old binding for this midi channel/type/value pair
// Note: can't use delete_binding() here because we don't know the specific controllable we want to remove, only the midi information
@@ -559,7 +560,7 @@ GenericMidiControlProtocol::set_state (const XMLNode& node, int version)
Controllable* c = Controllable::by_id (id);
if (c) {
- MIDIControllable* mc = new MIDIControllable (this, *_input_port, *c, false);
+ MIDIControllable* mc = new MIDIControllable (this, *_input_port->parser(), *c, false);
if (mc->set_state (**niter, version) == 0) {
controllables.push_back (mc);
@@ -754,7 +755,7 @@ GenericMidiControlProtocol::create_binding (const XMLNode& node)
prop = node.property (X_("uri"));
uri = prop->value();
- MIDIControllable* mc = new MIDIControllable (this, *_input_port, momentary);
+ MIDIControllable* mc = new MIDIControllable (this, *_input_port->parser(), momentary);
if (mc->init (uri)) {
delete mc;
@@ -892,7 +893,7 @@ GenericMidiControlProtocol::create_function (const XMLNode& node)
prop = node.property (X_("function"));
- MIDIFunction* mf = new MIDIFunction (*_input_port);
+ MIDIFunction* mf = new MIDIFunction (*_input_port->parser());
if (mf->setup (*this, prop->value(), argument, data, data_size)) {
delete mf;
@@ -988,7 +989,7 @@ GenericMidiControlProtocol::create_action (const XMLNode& node)
prop = node.property (X_("action"));
- MIDIAction* ma = new MIDIAction (*_input_port);
+ MIDIAction* ma = new MIDIAction (*_input_port->parser());
if (ma->init (*this, prop->value(), data, data_size)) {
delete ma;
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
index a7c420cc41..a4a51b7f99 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h
@@ -22,14 +22,11 @@
#include <list>
#include <glibmm/threads.h>
+
#include "ardour/types.h"
#include "control_protocol/control_protocol.h"
-namespace MIDI {
- class Port;
-}
-
namespace PBD {
class Controllable;
class ControllableDescriptor;
@@ -37,6 +34,11 @@ namespace PBD {
namespace ARDOUR {
class Session;
+ class MidiPort;
+}
+
+namespace MIDI {
+ class Port;
}
class MIDIControllable;
@@ -51,8 +53,8 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
int set_active (bool yn);
static bool probe() { return true; }
- MIDI::Port* input_port () const { return _input_port; }
- MIDI::Port* output_port () const { return _output_port; }
+ MIDI::Port* input_port () const { return _input_port; }
+ MIDI::Port* output_port () const { return _output_port; }
void set_feedback_interval (ARDOUR::microseconds_t);
int set_feedback (bool yn);
@@ -97,8 +99,8 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
}
private:
- MIDI::Port* _input_port;
- MIDI::Port* _output_port;
+ MIDI::Port* _input_port;
+ MIDI::Port* _output_port;
ARDOUR::microseconds_t _feedback_interval;
ARDOUR::microseconds_t last_feedback_time;
diff --git a/libs/surfaces/generic_midi/midiaction.cc b/libs/surfaces/generic_midi/midiaction.cc
index e1eed1a49e..e537122e9c 100644
--- a/libs/surfaces/generic_midi/midiaction.cc
+++ b/libs/surfaces/generic_midi/midiaction.cc
@@ -25,7 +25,7 @@
using namespace MIDI;
-MIDIAction::MIDIAction (MIDI::Port& p)
+MIDIAction::MIDIAction (MIDI::Parser& p)
: MIDIInvokable (p)
{
}
diff --git a/libs/surfaces/generic_midi/midiaction.h b/libs/surfaces/generic_midi/midiaction.h
index 521f59f26d..e2a29143ad 100644
--- a/libs/surfaces/generic_midi/midiaction.h
+++ b/libs/surfaces/generic_midi/midiaction.h
@@ -36,8 +36,6 @@ namespace Gtk {
}
namespace MIDI {
- class Channel;
- class Port;
class Parser;
}
@@ -46,7 +44,7 @@ class GenericMidiControlProtocol;
class MIDIAction : public MIDIInvokable
{
public:
- MIDIAction (MIDI::Port&);
+ MIDIAction (MIDI::Parser&);
virtual ~MIDIAction ();
int init (GenericMidiControlProtocol&, const std::string& action_name, MIDI::byte* sysex = 0, size_t ssize = 0);
diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc
index d36ccefd44..d78dd5e644 100644
--- a/libs/surfaces/generic_midi/midicontrollable.cc
+++ b/libs/surfaces/generic_midi/midicontrollable.cc
@@ -27,9 +27,9 @@
#include "pbd/xml++.h"
#include "pbd/stacktrace.h"
-#include "midi++/port.h"
#include "midi++/channel.h"
+#include "ardour/async_midi_port.h"
#include "ardour/automation_control.h"
#include "ardour/midi_ui.h"
#include "ardour/utils.h"
@@ -42,11 +42,11 @@ using namespace MIDI;
using namespace PBD;
using namespace ARDOUR;
-MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, Port& p, bool m)
+MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, MIDI::Parser& p, bool m)
: _surface (s)
, controllable (0)
, _descriptor (0)
- , _port (p)
+ , _parser (p)
, _momentary (m)
{
_learned = false; /* from URI */
@@ -59,10 +59,10 @@ MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, Port& p, bool
feedback = true; // for now
}
-MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, Port& p, Controllable& c, bool m)
+MIDIControllable::MIDIControllable (GenericMidiControlProtocol* s, MIDI::Parser& p, Controllable& c, bool m)
: _surface (s)
, _descriptor (0)
- , _port (p)
+ , _parser (p)
, _momentary (m)
{
set_controllable (&c);
@@ -149,7 +149,7 @@ void
MIDIControllable::learn_about_external_control ()
{
drop_external_control ();
- _port.parser()->any.connect_same_thread (midi_learn_connection, boost::bind (&MIDIControllable::midi_receiver, this, _1, _2, _3));
+ _parser.any.connect_same_thread (midi_learn_connection, boost::bind (&MIDIControllable::midi_receiver, this, _1, _2, _3));
}
void
@@ -357,12 +357,6 @@ MIDIControllable::midi_receiver (Parser &, byte *msg, size_t /*len*/)
return;
}
- /* if the our port doesn't do input anymore, forget it ... */
-
- if (!_port.parser()) {
- return;
- }
-
bind_midi ((channel_t) (msg[0] & 0xf), eventType (msg[0] & 0xF0), msg[1]);
if (controllable) {
@@ -381,49 +375,43 @@ MIDIControllable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional)
control_channel = chn;
control_additional = additional;
- if (_port.parser() == 0) {
- return;
- }
-
- Parser& p = *_port.parser();
-
int chn_i = chn;
switch (ev) {
case MIDI::off:
- p.channel_note_off[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2));
+ _parser.channel_note_off[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2));
/* if this is a togglee, connect to noteOn as well,
and we'll toggle back and forth between the two.
*/
if (_momentary) {
- p.channel_note_on[chn_i].connect_same_thread (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2));
+ _parser.channel_note_on[chn_i].connect_same_thread (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2));
}
_control_description = "MIDI control: NoteOff";
break;
case MIDI::on:
- p.channel_note_on[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2));
+ _parser.channel_note_on[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_note_on, this, _1, _2));
if (_momentary) {
- p.channel_note_off[chn_i].connect_same_thread (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2));
+ _parser.channel_note_off[chn_i].connect_same_thread (midi_sense_connection[1], boost::bind (&MIDIControllable::midi_sense_note_off, this, _1, _2));
}
_control_description = "MIDI control: NoteOn";
break;
case MIDI::controller:
- p.channel_controller[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_controller, this, _1, _2));
+ _parser.channel_controller[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_controller, this, _1, _2));
snprintf (buf, sizeof (buf), "MIDI control: Controller %d", control_additional);
_control_description = buf;
break;
case MIDI::program:
- p.channel_program_change[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_program_change, this, _1, _2));
+ _parser.channel_program_change[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_program_change, this, _1, _2));
_control_description = "MIDI control: ProgramChange";
break;
case MIDI::pitchbend:
- p.channel_pitchbend[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_pitchbend, this, _1, _2));
+ _parser.channel_pitchbend[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIControllable::midi_sense_pitchbend, this, _1, _2));
_control_description = "MIDI control: Pitchbend";
break;
diff --git a/libs/surfaces/generic_midi/midicontrollable.h b/libs/surfaces/generic_midi/midicontrollable.h
index dd9dc988b4..aeed05db4a 100644
--- a/libs/surfaces/generic_midi/midicontrollable.h
+++ b/libs/surfaces/generic_midi/midicontrollable.h
@@ -36,17 +36,20 @@ namespace PBD {
namespace MIDI {
class Channel;
- class Port;
class Parser;
}
class GenericMidiControlProtocol;
+namespace ARDOUR {
+ class AsyncMIDIPort;
+}
+
class MIDIControllable : public PBD::Stateful
{
public:
- MIDIControllable (GenericMidiControlProtocol *, MIDI::Port&, PBD::Controllable&, bool momentary);
- MIDIControllable (GenericMidiControlProtocol *, MIDI::Port&, bool momentary = false);
+ MIDIControllable (GenericMidiControlProtocol *, MIDI::Parser&, PBD::Controllable&, bool momentary);
+ MIDIControllable (GenericMidiControlProtocol *, MIDI::Parser&, bool momentary = false);
virtual ~MIDIControllable ();
int init (const std::string&);
@@ -72,7 +75,7 @@ class MIDIControllable : public PBD::Stateful
bool learned() const { return _learned; }
- MIDI::Port& get_port() const { return _port; }
+ MIDI::Parser& get_parser() { return _parser; }
PBD::Controllable* get_controllable() const { return controllable; }
void set_controllable (PBD::Controllable*);
const std::string& current_uri() const { return _current_uri; }
@@ -98,8 +101,8 @@ class MIDIControllable : public PBD::Stateful
GenericMidiControlProtocol* _surface;
PBD::Controllable* controllable;
PBD::ControllableDescriptor* _descriptor;
- std::string _current_uri;
- MIDI::Port& _port;
+ std::string _current_uri;
+ MIDI::Parser& _parser;
bool setting;
int last_value;
float last_controllable_value;
diff --git a/libs/surfaces/generic_midi/midifunction.cc b/libs/surfaces/generic_midi/midifunction.cc
index 70e9337861..b0dc95e4fc 100644
--- a/libs/surfaces/generic_midi/midifunction.cc
+++ b/libs/surfaces/generic_midi/midifunction.cc
@@ -25,7 +25,7 @@
using namespace MIDI;
-MIDIFunction::MIDIFunction (MIDI::Port& p)
+MIDIFunction::MIDIFunction (MIDI::Parser& p)
: MIDIInvokable (p)
{
}
diff --git a/libs/surfaces/generic_midi/midifunction.h b/libs/surfaces/generic_midi/midifunction.h
index 8f0b0218d0..88aff0ab0a 100644
--- a/libs/surfaces/generic_midi/midifunction.h
+++ b/libs/surfaces/generic_midi/midifunction.h
@@ -33,7 +33,6 @@
namespace MIDI {
class Channel;
- class Port;
class Parser;
}
@@ -64,7 +63,7 @@ class MIDIFunction : public MIDIInvokable
TrackSetSoloIsolate,
};
- MIDIFunction (MIDI::Port&);
+ MIDIFunction (MIDI::Parser&);
virtual ~MIDIFunction ();
int setup (GenericMidiControlProtocol&, const std::string& function_name, const std::string& argument, MIDI::byte* sysex = 0, size_t ssize = 0);
diff --git a/libs/surfaces/generic_midi/midiinvokable.cc b/libs/surfaces/generic_midi/midiinvokable.cc
index 79835835a4..42c74553d8 100644
--- a/libs/surfaces/generic_midi/midiinvokable.cc
+++ b/libs/surfaces/generic_midi/midiinvokable.cc
@@ -25,8 +25,8 @@
using namespace MIDI;
-MIDIInvokable::MIDIInvokable (MIDI::Port& p)
- : _port (p)
+MIDIInvokable::MIDIInvokable (MIDI::Parser& p)
+ : _parser (p)
{
data_size = 0;
data = 0;
@@ -127,12 +127,6 @@ MIDIInvokable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional)
control_channel = chn;
control_additional = additional;
- if (_port.parser() == 0) {
- return;
- }
-
- Parser& p = *_port.parser();
-
int chn_i = chn;
/* incoming MIDI is parsed by Ardour' MidiUI event loop/thread, and we want our handlers to execute in that context, so we use
@@ -141,27 +135,27 @@ MIDIInvokable::bind_midi (channel_t chn, eventType ev, MIDI::byte additional)
switch (ev) {
case MIDI::off:
- p.channel_note_off[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_note_off, this, _1, _2));
+ _parser.channel_note_off[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_note_off, this, _1, _2));
break;
case MIDI::on:
- p.channel_note_on[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_note_on, this, _1, _2));
+ _parser.channel_note_on[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_note_on, this, _1, _2));
break;
case MIDI::controller:
- p.channel_controller[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_controller, this, _1, _2));
+ _parser.channel_controller[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_controller, this, _1, _2));
break;
case MIDI::program:
- p.channel_program_change[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_program_change, this, _1, _2));
+ _parser.channel_program_change[chn_i].connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_program_change, this, _1, _2));
break;
case MIDI::sysex:
- p.sysex.connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_sysex, this, _1, _2, _3));
+ _parser.sysex.connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_sysex, this, _1, _2, _3));
break;
case MIDI::any:
- p.any.connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_any, this, _1, _2, _3));
+ _parser.any.connect_same_thread (midi_sense_connection[0], boost::bind (&MIDIInvokable::midi_sense_any, this, _1, _2, _3));
break;
default:
diff --git a/libs/surfaces/generic_midi/midiinvokable.h b/libs/surfaces/generic_midi/midiinvokable.h
index 62cbab238c..f374a126a5 100644
--- a/libs/surfaces/generic_midi/midiinvokable.h
+++ b/libs/surfaces/generic_midi/midiinvokable.h
@@ -31,7 +31,6 @@
namespace MIDI {
class Channel;
- class Port;
class Parser;
}
@@ -40,12 +39,12 @@ class GenericMidiControlProtocol;
class MIDIInvokable : public PBD::Stateful
{
public:
- MIDIInvokable (MIDI::Port&);
+ MIDIInvokable (MIDI::Parser&);
virtual ~MIDIInvokable ();
virtual int init (GenericMidiControlProtocol&, const std::string&, MIDI::byte* data = 0, size_t dsize = 0);
- MIDI::Port& get_port() const { return _port; }
+ MIDI::Parser& get_parser() { return _parser; }
void bind_midi (MIDI::channel_t, MIDI::eventType, MIDI::byte);
MIDI::channel_t get_control_channel () { return control_channel; }
@@ -55,7 +54,7 @@ class MIDIInvokable : public PBD::Stateful
protected:
GenericMidiControlProtocol* _ui;
std::string _invokable_name;
- MIDI::Port& _port;
+ MIDI::Parser& _parser;
PBD::ScopedConnection midi_sense_connection[2];
MIDI::eventType control_type;
MIDI::byte control_additional;
diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc
index cfa6524f70..32be851247 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol.cc
@@ -101,7 +101,7 @@ MackieControlProtocol::MackieControlProtocol (Session& session)
, _gui (0)
, _zoom_mode (false)
, _scrub_mode (false)
- , _flip_mode (false)
+ , _flip_mode (Normal)
, _view_mode (Mixer)
, _current_selected_track (-1)
, _modifier_state (0)
@@ -393,7 +393,9 @@ MackieControlProtocol::set_active (bool yn)
BaseUI::run ();
- create_surfaces ();
+ if (create_surfaces ()) {
+ return -1;
+ }
connect_session_signals ();
_active = true;
update_surfaces ();
@@ -606,7 +608,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);
@@ -615,7 +617,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) {
@@ -629,13 +631,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;
@@ -652,7 +657,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);
@@ -698,6 +709,8 @@ MackieControlProtocol::create_surfaces ()
g_source_ref (psrc->gobj());
}
}
+
+ return 0;
}
void
@@ -1236,7 +1249,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);
}
@@ -1271,11 +1284,11 @@ MackieControlProtocol::set_view_mode (ViewMode m)
}
void
-MackieControlProtocol::set_flip_mode (bool yn)
+MackieControlProtocol::set_flip_mode (FlipMode fm)
{
Glib::Threads::Mutex::Lock lm (surfaces_lock);
- _flip_mode = yn;
+ _flip_mode = fm;
for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
(*s)->update_flip_mode_display ();
@@ -1573,14 +1586,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 710745f157..4669247726 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.h
+++ b/libs/surfaces/mackie/mackie_control_protocol.h
@@ -120,16 +120,16 @@ 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&);
- bool flip_mode () const { return _flip_mode; }
+ FlipMode flip_mode () const { return _flip_mode; }
ViewMode view_mode () const { return _view_mode; }
bool zoom_mode () const { return _zoom_mode; }
bool metering_active () const { return _metering_active; }
void set_view_mode (ViewMode);
- void set_flip_mode (bool);
+ void set_flip_mode (FlipMode);
XMLNode& get_state ();
int set_state (const XMLNode&, int version);
@@ -278,7 +278,7 @@ class MackieControlProtocol
void* _gui;
bool _zoom_mode;
bool _scrub_mode;
- bool _flip_mode;
+ FlipMode _flip_mode;
ViewMode _view_mode;
int _current_selected_track;
int _modifier_state;
@@ -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/mcp_buttons.cc b/libs/surfaces/mackie/mcp_buttons.cc
index 286e87a0fb..792813bf33 100644
--- a/libs/surfaces/mackie/mcp_buttons.cc
+++ b/libs/surfaces/mackie/mcp_buttons.cc
@@ -814,8 +814,12 @@ MackieControlProtocol::dyn_release (Button &)
LedState
MackieControlProtocol::flip_press (Button &)
{
- set_flip_mode (!_flip_mode);
- return (_flip_mode ? on : off);
+ if (_flip_mode != Normal) {
+ set_flip_mode (Normal);
+ } else {
+ set_flip_mode (Mirror);
+ }
+ return ((_flip_mode != Normal) ? on : off);
}
LedState
MackieControlProtocol::flip_release (Button &)
diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc
index fd8e956ba1..c736b3f7e6 100644
--- a/libs/surfaces/mackie/strip.cc
+++ b/libs/surfaces/mackie/strip.cc
@@ -291,7 +291,7 @@ Strip::notify_gain_changed (bool force_update)
Control* control;
- if (_surface->mcp().flip_mode()) {
+ if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) {
control = _vpot;
} else {
control = _fader;
@@ -304,7 +304,7 @@ Strip::notify_gain_changed (bool force_update)
if (force_update || normalized_position != _last_gain_position_written) {
- if (_surface->mcp().flip_mode()) {
+ if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) {
if (!control->in_use()) {
_surface->write (_vpot->set (normalized_position, true, Pot::wrap));
}
@@ -407,7 +407,7 @@ Strip::notify_panner_width_changed (bool force_update)
if (force_update || pos != _last_pan_azi_position_written) {
- if (_surface->mcp().flip_mode()) {
+ if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) {
if (control == _fader) {
if (!control->in_use()) {
@@ -944,7 +944,7 @@ Strip::next_pot_mode ()
{
vector<Evoral::Parameter>::iterator i;
- if (_surface->mcp().flip_mode()) {
+ if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) {
/* do not change vpot mode while in flipped mode */
DEBUG_TRACE (DEBUG::MackieControl, "not stepping pot mode - in flip mode\n");
_surface->write (display (1, "Flip"));
@@ -997,7 +997,7 @@ Strip::set_vpot_parameter (Evoral::Parameter p)
case PanAzimuthAutomation:
pannable = _route->pannable ();
if (pannable) {
- if (_surface->mcp().flip_mode()) {
+ if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) {
/* gain to vpot, pan azi to fader */
_vpot->set_control (_route->gain_control());
control_by_parameter[GainAutomation] = _vpot;
@@ -1025,7 +1025,7 @@ Strip::set_vpot_parameter (Evoral::Parameter p)
case PanWidthAutomation:
pannable = _route->pannable ();
if (pannable) {
- if (_surface->mcp().flip_mode()) {
+ if (_surface->mcp().flip_mode() != MackieControlProtocol::Normal) {
/* gain to vpot, pan width to fader */
_vpot->set_control (_route->gain_control());
control_by_parameter[GainAutomation] = _vpot;
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);