summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2015-10-13 15:34:53 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2015-10-13 15:34:53 -0400
commit53a28c230adc1182f5b22ea6975aef9e12859511 (patch)
treeeb57c8f770b114ebed257553d8ed92a870330edd
parent2d270094100dd3ec18a552cc9f40057706c3d519 (diff)
mackie support omnibus patch
Fixes all kinds of miscellaneous issues with MCP. Also removes several theoretical pan modes, replace "Tracks" pan mode with "Trim", and takes a tiny step towards view modes
-rw-r--r--libs/surfaces/mackie/device_info.cc6
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.cc85
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.h8
-rw-r--r--libs/surfaces/mackie/mcp_buttons.cc44
-rw-r--r--libs/surfaces/mackie/strip.cc17
-rw-r--r--libs/surfaces/mackie/strip.h2
-rw-r--r--libs/surfaces/mackie/surface.cc53
7 files changed, 129 insertions, 86 deletions
diff --git a/libs/surfaces/mackie/device_info.cc b/libs/surfaces/mackie/device_info.cc
index 2fcd5abf06..b94cb05544 100644
--- a/libs/surfaces/mackie/device_info.cc
+++ b/libs/surfaces/mackie/device_info.cc
@@ -449,6 +449,12 @@ DeviceInfo::has_meters() const
}
bool
+DeviceInfo::has_separate_meters() const
+{
+ return _has_meters;
+}
+
+bool
DeviceInfo::has_two_character_display() const
{
return _has_two_character_display;
diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc
index 5f35dda080..9e1a2bbce7 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol.cc
@@ -279,10 +279,7 @@ MackieControlProtocol::get_sorted_routes()
if (route_is_locked_to_strip(route)) {
continue;
}
- /* This next section which is not used yet, looks wrong to me
- The first four belong here but the bottom five are not a selection
- of routes and belong elsewhere as they are v-pot modes.
- */
+
switch (_view_mode) {
case Mixer:
break;
@@ -292,7 +289,9 @@ MackieControlProtocol::get_sorted_routes()
break;
case MidiTracks:
break;
- case Loop:
+ case Plugins:
+ break;
+ case Auxes:
break;
}
@@ -531,17 +530,21 @@ MackieControlProtocol::update_timecode_beats_led()
void
MackieControlProtocol::update_global_button (int id, LedState ls)
{
- Glib::Threads::Mutex::Lock lm (surfaces_lock);
+ boost::shared_ptr<Surface> surface;
- if (surfaces.empty()) {
- return;
- }
+ {
+ Glib::Threads::Mutex::Lock lm (surfaces_lock);
- if (!_device_info.has_global_controls()) {
- return;
+ if (surfaces.empty()) {
+ return;
+ }
+
+ if (!_device_info.has_global_controls()) {
+ return;
+ }
+ // surface needs to be master surface
+ surface = _master_surface;
}
- // surface needs to be master surface
- boost::shared_ptr<Surface> surface = _master_surface;
map<int,Control*>::iterator x = surface->controls_by_device_independent_id.find (id);
if (x != surface->controls_by_device_independent_id.end()) {
@@ -704,7 +707,12 @@ MackieControlProtocol::set_device (const string& device_name, bool force)
we will have its state available.
*/
- update_configuration_state ();
+ {
+ Glib::Threads::Mutex::Lock lm (surfaces_lock);
+ if (!surfaces.empty()) {
+ update_configuration_state ();
+ }
+ }
if (set_device_info (device_name)) {
return -1;
@@ -807,9 +815,9 @@ MackieControlProtocol::create_surfaces ()
}
}
if (this_device) {
- XMLNode* surfaces = this_device->child (X_("Surfaces"));
- if (surfaces) {
- surface->set_state (*surfaces, state_version);
+ XMLNode* snode = this_device->child (X_("Surfaces"));
+ if (snode) {
+ surface->set_state (*snode, state_version);
}
}
}
@@ -911,6 +919,8 @@ MackieControlProtocol::close()
void
MackieControlProtocol::update_configuration_state ()
{
+ /* CALLER MUST HOLD SURFACES LOCK */
+
if (!configuration_state) {
configuration_state = new XMLNode (X_("Configurations"));
}
@@ -922,14 +932,12 @@ MackieControlProtocol::update_configuration_state ()
configuration_state->add_child_nocopy (*devnode);
XMLNode* snode = new XMLNode (X_("Surfaces"));
- devnode->add_child_nocopy (*snode);
- {
- Glib::Threads::Mutex::Lock lm (surfaces_lock);
- for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
- snode->add_child_nocopy ((*s)->get_state());
- }
+ for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
+ snode->add_child_nocopy ((*s)->get_state());
}
+
+ devnode->add_child_nocopy (*snode);
}
XMLNode&
@@ -951,7 +959,10 @@ MackieControlProtocol::get_state()
node.add_property (X_("device-profile"), _device_profile.name());
node.add_property (X_("device-name"), _device_info.name());
- update_configuration_state ();
+ {
+ Glib::Threads::Mutex::Lock lm (surfaces_lock);
+ update_configuration_state ();
+ }
/* force a copy of the _surfaces_state node, because we want to retain ownership */
node.add_child_copy (*configuration_state);
@@ -1552,15 +1563,33 @@ MackieControlProtocol::set_flip_mode (FlipMode fm)
void
MackieControlProtocol::set_pot_mode (PotMode m)
{
- Glib::Threads::Mutex::Lock lm (surfaces_lock);
-
_pot_mode = m;
- for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
- (*s)->update_potmode ();
+ {
+ Glib::Threads::Mutex::Lock lm (surfaces_lock);
+ for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
+ (*s)->update_potmode ();
+
+ }
}
+ switch (_pot_mode) {
+ case Trim:
+ update_global_button (Button::Track, on);
+ update_global_button (Button::Send, off);
+ update_global_button (Button::Pan, off);
+ break;
+ case Send:
+ update_global_button (Button::Track, off);
+ update_global_button (Button::Send, on);
+ update_global_button (Button::Pan, off);
+ break;
+ case Pan:
+ update_global_button (Button::Track, off);
+ update_global_button (Button::Send, off);
+ update_global_button (Button::Pan, on);
+ };
}
void
diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h
index 530f328951..6e58f07946 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.h
+++ b/libs/surfaces/mackie/mackie_control_protocol.h
@@ -103,19 +103,17 @@ class MackieControlProtocol
enum ViewMode {
Mixer,
- Loop,
AudioTracks,
MidiTracks,
Busses,
+ Auxes,
+ Plugins,
};
enum PotMode {
- Tracks,
+ Trim,
Send,
Pan,
- PlugIn,
- EQ,
- Instrument,
};
enum FlipMode {
diff --git a/libs/surfaces/mackie/mcp_buttons.cc b/libs/surfaces/mackie/mcp_buttons.cc
index 781370a79e..a2bcdf7f4c 100644
--- a/libs/surfaces/mackie/mcp_buttons.cc
+++ b/libs/surfaces/mackie/mcp_buttons.cc
@@ -504,13 +504,9 @@ MackieControlProtocol::ffwd_release (Button &)
LedState
MackieControlProtocol::loop_press (Button &)
{
- if (main_modifier_state() & MODIFIER_CONTROL) {
- set_view_mode (Loop);
- return on;
- } else {
- session->request_play_loop (!session->get_play_loop());
- return none;
- }
+ bool was_on = session->get_play_loop();
+ session->request_play_loop (!was_on);
+ return was_on ? off : on;
}
LedState
@@ -660,13 +656,7 @@ LedState
MackieControlProtocol::pan_press (Button &)
{
set_pot_mode (Pan);
- update_global_button (Button::Track, off);
- update_global_button (Button::Send, off);
- update_global_button (Button::Plugin, off);
- update_global_button (Button::Eq, off);
- update_global_button (Button::Dyn, off);
- return on;
-
+ return none;
}
LedState
MackieControlProtocol::pan_release (Button &)
@@ -681,7 +671,8 @@ MackieControlProtocol::plugin_press (Button &)
LedState
MackieControlProtocol::plugin_release (Button &)
{
- return none;
+ set_view_mode (Plugins);
+ return none; /* LED state set by set_view_mode */
}
LedState
MackieControlProtocol::eq_press (Button &)
@@ -837,14 +828,8 @@ MackieControlProtocol::clearsolo_release (Mackie::Button&)
Mackie::LedState
MackieControlProtocol::track_press (Mackie::Button&)
{
- set_pot_mode (Tracks);
- update_global_button (Button::Pan, off);
- update_global_button (Button::Send, off);
- update_global_button (Button::Plugin, off);
- update_global_button (Button::Eq, off);
- update_global_button (Button::Dyn, off);
- return on;
-
+ set_pot_mode (Trim);
+ return none;
}
Mackie::LedState
MackieControlProtocol::track_release (Mackie::Button&)
@@ -854,15 +839,10 @@ MackieControlProtocol::track_release (Mackie::Button&)
Mackie::LedState
MackieControlProtocol::send_press (Mackie::Button&)
{
- return off;
+ return none;
// remove above line when sends implemented
set_pot_mode (Send);
- update_global_button (Button::Track, off);
- update_global_button (Button::Pan, off);
- update_global_button (Button::Plugin, off);
- update_global_button (Button::Eq, off);
- update_global_button (Button::Dyn, off);
- return on;
+ return none;
}
Mackie::LedState
MackieControlProtocol::send_release (Mackie::Button&)
@@ -877,6 +857,7 @@ MackieControlProtocol::miditracks_press (Mackie::Button&)
Mackie::LedState
MackieControlProtocol::miditracks_release (Mackie::Button&)
{
+ set_view_mode (MidiTracks);
return none;
}
Mackie::LedState
@@ -897,6 +878,7 @@ MackieControlProtocol::audiotracks_press (Mackie::Button&)
Mackie::LedState
MackieControlProtocol::audiotracks_release (Mackie::Button&)
{
+ set_view_mode (AudioTracks);
return none;
}
Mackie::LedState
@@ -917,6 +899,7 @@ MackieControlProtocol::aux_press (Mackie::Button&)
Mackie::LedState
MackieControlProtocol::aux_release (Mackie::Button&)
{
+ set_view_mode (Auxes);
return none;
}
Mackie::LedState
@@ -927,6 +910,7 @@ MackieControlProtocol::busses_press (Mackie::Button&)
Mackie::LedState
MackieControlProtocol::busses_release (Mackie::Button&)
{
+ set_view_mode (Busses);
return none;
}
Mackie::LedState
diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc
index bf9e33d1b4..7f4cda8d19 100644
--- a/libs/surfaces/mackie/strip.cc
+++ b/libs/surfaces/mackie/strip.cc
@@ -797,7 +797,9 @@ Strip::periodic (ARDOUR::microseconds_t now)
}
if (_block_screen_redisplay_until >= now) {
-
+ if (_surface->mcp().device_info().has_separate_meters()) {
+ goto meters;
+ }
/* no drawing here, for now */
return;
@@ -832,6 +834,7 @@ Strip::periodic (ARDOUR::microseconds_t now)
update_automation ();
}
+ meters:
update_meter ();
}
@@ -1014,25 +1017,23 @@ Strip::potmode_changed (bool notify)
block_vpot_mode_display_for (1000);
return;
}
+
// WIP
int pm = _surface->mcp().pot_mode();
switch (pm) {
case MackieControlProtocol::Pan:
// This needs to set current pan mode (azimuth or width... or whatever)
set_vpot_parameter (_pan_mode);
- DEBUG_TRACE (DEBUG::MackieControl, "Assign pot to Pan mode.\n");
+ DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Assign pot to Pan mode %1\n", enum_2_string (_pan_mode)));
break;
- case MackieControlProtocol::Tracks: // should change the Tracks to Trim
+ case MackieControlProtocol::Trim:
DEBUG_TRACE (DEBUG::MackieControl, "Assign pot to Trim mode.\n");
- set_vpot_parameter (TrimAutomation);
- break;
+ set_vpot_parameter (TrimAutomation);
+ break;
case MackieControlProtocol::Send:
DEBUG_TRACE (DEBUG::MackieControl, "Assign pot to Send mode.\n");
// set to current send
break;
- default:
- cerr << "Pot mode " << pm << " not yet handled\n";
- break;
}
if (notify) {
diff --git a/libs/surfaces/mackie/strip.h b/libs/surfaces/mackie/strip.h
index f0c972aa73..29920b8aba 100644
--- a/libs/surfaces/mackie/strip.h
+++ b/libs/surfaces/mackie/strip.h
@@ -109,7 +109,7 @@ private:
boost::shared_ptr<ARDOUR::Route> _route;
PBD::ScopedConnectionList route_connections;
- int _pan_mode;
+ ARDOUR::AutomationType _pan_mode;
float _last_gain_position_written;
float _last_pan_azi_position_written;
diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc
index 1ef37672c6..8c4c10a336 100644
--- a/libs/surfaces/mackie/surface.cc
+++ b/libs/surfaces/mackie/surface.cc
@@ -1032,40 +1032,65 @@ Surface::update_view_mode_display ()
switch (_mcp.view_mode()) {
case MackieControlProtocol::Mixer:
show_two_char_display ("Mx");
- //id = Button::Pan;
- break;
- case MackieControlProtocol::Loop:
- show_two_char_display ("LP");
- id = Button::Loop;
+ id = Button::Track;
+ text = _("Mixer View");
break;
case MackieControlProtocol::AudioTracks:
show_two_char_display ("AT");
+ id = Button::AudioTracks;
+ text = _("Audio Tracks");
break;
case MackieControlProtocol::MidiTracks:
show_two_char_display ("MT");
+ id = Button::MidiTracks;
+ text = _("MIDI Tracks");
+ break;
+ case MackieControlProtocol::Plugins:
+ show_two_char_display ("PL");
+ id = Button::Plugin;
+ text = _("Plugins");
+ break;
+ case MackieControlProtocol::Busses:
+ show_two_char_display ("BS");
+ id = Button::Busses;
+ text = _("Busses");
+ break;
+ case MackieControlProtocol::Auxes:
+ show_two_char_display ("AB");
+ id = Button::Aux;
+ text = _("Auxes");
break;
default:
break;
}
+ vector<int> view_mode_buttons;
+ view_mode_buttons.push_back (Button::Track);
+ view_mode_buttons.push_back (Button::Busses);
+ view_mode_buttons.push_back (Button::Plugin);
+ view_mode_buttons.push_back (Button::AudioTracks);
+ view_mode_buttons.push_back (Button::MidiTracks);
+ view_mode_buttons.push_back (Button::Aux);
+
if (id >= 0) {
- /* we are attempting to turn a global button/LED on */
+ for (vector<int>::iterator i = view_mode_buttons.begin(); i != view_mode_buttons.end(); ++i) {
+ map<int,Control*>::iterator x = controls_by_device_independent_id.find (id);
- map<int,Control*>::iterator x = controls_by_device_independent_id.find (id);
+ if (x != controls_by_device_independent_id.end()) {
+ Button* button = dynamic_cast<Button*> (x->second);
+ if (button) {
+ bool onoff;
+ onoff = (*i) == id;
- if (x != controls_by_device_independent_id.end()) {
- Button* button = dynamic_cast<Button*> (x->second);
- if (button) {
- _port->write (button->set_state (on));
+ _port->write (button->set_state (onoff));
+ }
}
}
}
if (!text.empty()) {
- for (Strips::iterator s = strips.begin(); s != strips.end(); ++s) {
- _port->write ((*s)->display (1, text));
- }
+ display_message_for (text, 1000);
}
}