summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2012-06-01 12:56:20 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2012-06-01 12:56:20 +0000
commitba5e71b50f53c97c1ce806d9582c4c32970bdcf6 (patch)
tree62e95853f436d4bb5dc1514425fb2164f7adba49 /libs
parentbc3aea6f93edf23c19dc672dd5b1f44bca71f571 (diff)
MCP: Patch from Rodrigo that:
* implements Metering on/off through Button::Read as per Seablade's suggestion. I choose this button as it's the "Show meters" button in Traktion; * removes redundant code from Meter::update_transport_rolling(); * renames Meter::update_transport_rolling() to Meter::notify_metering_state_changed(); * renamed Surface::notify_transport_state_changed() to Surface::notify_metering_state_changed(); * renamed Strip::notify_transport_state_changed() to Strip::notify_metering_state_changed(); * created MackieControlProtocol::notify_metering_state_changed() and made MackieControlProtocol::notify_transport_state_changed() use it; * implemented turning off of timecode display and two char display in Surface::zero_all (); * implemented master fader zeroing in Surface::zero_all (); * calling Surfaces->zero_all() at MackieControlProtocol destructor; * implemented restore of 2nd LCD line content after metering being active. git-svn-id: svn://localhost/ardour2/branches/3.0@12520 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.cc21
-rw-r--r--libs/surfaces/mackie/mackie_control_protocol.h5
-rw-r--r--libs/surfaces/mackie/mcp_buttons.cc6
-rw-r--r--libs/surfaces/mackie/meter.cc61
-rw-r--r--libs/surfaces/mackie/meter.h3
-rw-r--r--libs/surfaces/mackie/strip.cc27
-rw-r--r--libs/surfaces/mackie/strip.h4
-rw-r--r--libs/surfaces/mackie/surface.cc24
-rw-r--r--libs/surfaces/mackie/surface.h2
9 files changed, 80 insertions, 73 deletions
diff --git a/libs/surfaces/mackie/mackie_control_protocol.cc b/libs/surfaces/mackie/mackie_control_protocol.cc
index 1efe904976..c291b91e92 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.cc
+++ b/libs/surfaces/mackie/mackie_control_protocol.cc
@@ -107,6 +107,7 @@ MackieControlProtocol::MackieControlProtocol (Session& session)
, _modifier_state (0)
, _ipmidi_base (MIDI::IPMIDIPort::lowest_ipmidi_port_default)
, needs_ipmidi_restart (false)
+ , _metering_active (true)
{
DEBUG_TRACE (DEBUG::MackieControl, "MackieControlProtocol::MackieControlProtocol\n");
@@ -123,7 +124,11 @@ MackieControlProtocol::MackieControlProtocol (Session& session)
MackieControlProtocol::~MackieControlProtocol()
{
DEBUG_TRACE (DEBUG::MackieControl, "MackieControlProtocol::~MackieControlProtocol\n");
-
+
+ for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
+ (*s)->zero_all ();
+ }
+
drop_connections ();
tear_down_gui ();
@@ -880,14 +885,20 @@ MackieControlProtocol::notify_transport_state_changed()
update_global_button (Button::Stop, !session->transport_rolling());
update_global_button (Button::Rewind, session->transport_speed() < 0.0);
update_global_button (Button::Ffwd, session->transport_speed() > 1.0);
-
- for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
- (*s)->notify_transport_state_changed ();
- }
+
+ notify_metering_state_changed ();
_transport_previously_rolling = session->transport_rolling();
}
+void
+MackieControlProtocol::notify_metering_state_changed()
+{
+ for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
+ (*s)->notify_metering_state_changed ();
+ }
+}
+
void
MackieControlProtocol::notify_record_state_changed ()
{
diff --git a/libs/surfaces/mackie/mackie_control_protocol.h b/libs/surfaces/mackie/mackie_control_protocol.h
index 0fd5d8c8a2..eb3cc22b8c 100644
--- a/libs/surfaces/mackie/mackie_control_protocol.h
+++ b/libs/surfaces/mackie/mackie_control_protocol.h
@@ -128,6 +128,7 @@ class MackieControlProtocol
bool 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);
@@ -164,6 +165,7 @@ class MackieControlProtocol
void notify_record_state_changed();
void notify_transport_state_changed();
void notify_loop_state_changed();
+ void notify_metering_state_changed();
// mainly to pick up punch-in and punch-out
void notify_parameter_changed(std::string const &);
void notify_solo_active_changed(bool);
@@ -171,7 +173,7 @@ class MackieControlProtocol
/// Turn timecode on and beats off, or vice versa, depending
/// on state of _timecode_type
void update_timecode_beats_led();
-
+
/// this is called to generate the midi to send in response to a button press.
void update_led(Mackie::Surface&, Mackie::Button & button, Mackie::LedState);
@@ -286,6 +288,7 @@ class MackieControlProtocol
ButtonMap button_map;
int16_t _ipmidi_base;
bool needs_ipmidi_restart;
+ bool _metering_active;
ARDOUR::RouteNotificationList _last_selected_routes;
diff --git a/libs/surfaces/mackie/mcp_buttons.cc b/libs/surfaces/mackie/mcp_buttons.cc
index c864b5b871..be51f01651 100644
--- a/libs/surfaces/mackie/mcp_buttons.cc
+++ b/libs/surfaces/mackie/mcp_buttons.cc
@@ -1009,12 +1009,14 @@ MackieControlProtocol::snapshot_release (Mackie::Button&)
Mackie::LedState
MackieControlProtocol::read_press (Mackie::Button&)
{
- return none;
+ _metering_active = !_metering_active;
+ notify_metering_state_changed ();
+ return _metering_active;
}
Mackie::LedState
MackieControlProtocol::read_release (Mackie::Button&)
{
- return none;
+ return _metering_active;
}
Mackie::LedState
MackieControlProtocol::write_press (Mackie::Button&)
diff --git a/libs/surfaces/mackie/meter.cc b/libs/surfaces/mackie/meter.cc
index d4842aa5ca..fe11357d3a 100644
--- a/libs/surfaces/mackie/meter.cc
+++ b/libs/surfaces/mackie/meter.cc
@@ -22,7 +22,6 @@
#include "pbd/compose.h"
#include "ardour/debug.h"
-#include "mackie_control_protocol.h"
#include "meter.h"
#include "surface.h"
#include "surface_port.h"
@@ -42,54 +41,26 @@ Meter::factory (Surface& surface, int id, const char* name, Group& group)
}
void
-Meter::update_transport_rolling(Surface& surface)
-{
- bool transport_is_rolling = (surface.mcp().get_transport_speed () != 0.0f);
-
- if (_transport_is_rolling == transport_is_rolling) {
- return;
- }
- if (transport_is_rolling) {
- MidiByteArray enable_msg;
-
- // sysex header
- enable_msg << surface.sysex_hdr();
-
- // code for Channel Meter Enable Message
- enable_msg << 0x20;
-
- // Channel identification
- enable_msg << id();
-
- // Enabling level meter on LCD, peak hold display on horizontal meter and signal LED
- enable_msg << 0x07;
-
- // sysex trailer
- enable_msg << MIDI::eox;
-
- surface.write (enable_msg);
-
- } else {
- MidiByteArray disable_msg;
+Meter::notify_metering_state_changed(Surface& surface, bool transport_is_rolling, bool metering_active)
+{
+ MidiByteArray msg;
- // sysex header
- disable_msg << surface.sysex_hdr();
+ // sysex header
+ msg << surface.sysex_hdr();
- // code for Channel Meter Enable Message
- disable_msg << 0x20;
+ // code for Channel Meter Enable Message
+ msg << 0x20;
- // Channel identification
- disable_msg << id();
+ // Channel identification
+ msg << id();
- // Disabling level meter on LCD, peak hold display on horizontal meter and signal LED
- disable_msg << 0x00;
+ // Enable (0x07) / Disable (0x00) level meter on LCD, peak hold display on horizontal meter and signal LED
+ msg << ((transport_is_rolling && metering_active) ? 0x07 : 0x00);
- // sysex trailer
- disable_msg << MIDI::eox;
+ // sysex trailer
+ msg << MIDI::eox;
- surface.write (disable_msg);
- }
- _transport_is_rolling = transport_is_rolling;
+ surface.write (msg);
}
void
@@ -99,10 +70,6 @@ Meter::send_update (Surface& surface, float dB)
// DEBUG_TRACE (DEBUG::MackieControl, string_compose ("Meter ID %1 dB %2\n", id(), dB));
- if (!_transport_is_rolling) {
- return;
- }
-
if (dB < -70.0f) {
def = 0.0f;
} else if (dB < -60.0f) {
diff --git a/libs/surfaces/mackie/meter.h b/libs/surfaces/mackie/meter.h
index fffba9599d..db3e8cffb3 100644
--- a/libs/surfaces/mackie/meter.h
+++ b/libs/surfaces/mackie/meter.h
@@ -40,11 +40,10 @@ public:
static Control* factory (Surface&, int id, const char*, Group&);
- void update_transport_rolling(Surface& surface);
+ void notify_metering_state_changed(Surface& surface, bool transport_is_rolling, bool metering_active);
private:
bool overload_on;
- bool _transport_is_rolling;
};
}
diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc
index 64ea8785cd..84c32138a3 100644
--- a/libs/surfaces/mackie/strip.cc
+++ b/libs/surfaces/mackie/strip.cc
@@ -73,6 +73,8 @@ Strip::Strip (Surface& s, const std::string& name, int index, const map<Button::
, _index (index)
, _surface (&s)
, _controls_locked (false)
+ , _transport_is_rolling (false)
+ , _metering_active (true)
, _reset_display_at (0)
, _last_gain_position_written (-1.0)
, _last_pan_azi_position_written (-1.0)
@@ -690,7 +692,7 @@ Strip::update_automation ()
void
Strip::update_meter ()
{
- if (_meter) {
+ if (_meter && _transport_is_rolling && _metering_active) {
float dB = const_cast<PeakMeter&> (_route->peak_meter()).peak_power (0);
_meter->send_update (*_surface, dB);
}
@@ -1068,9 +1070,26 @@ Strip::reset_saved_values ()
}
void
-Strip::notify_transport_state_changed()
+Strip::notify_metering_state_changed()
{
- if (_meter) {
- _meter->update_transport_rolling (*_surface);
+ if (!_route || !_meter) {
+ return;
+ }
+
+ bool transport_is_rolling = (_surface->mcp().get_transport_speed () != 0.0f);
+ bool metering_active = _surface->mcp().metering_active ();
+
+ if ((_transport_is_rolling == transport_is_rolling) && (_metering_active == metering_active)) {
+ return;
}
+
+ _meter->notify_metering_state_changed (*_surface, transport_is_rolling, metering_active);
+
+ if (!transport_is_rolling || !metering_active) {
+ notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name));
+ notify_panner_azi_changed (true);
+ }
+
+ _transport_is_rolling = transport_is_rolling;
+ _metering_active = metering_active;
}
diff --git a/libs/surfaces/mackie/strip.h b/libs/surfaces/mackie/strip.h
index 0e58b9ec2f..d5fdc6c17c 100644
--- a/libs/surfaces/mackie/strip.h
+++ b/libs/surfaces/mackie/strip.h
@@ -84,7 +84,7 @@ public:
void gui_selection_changed (const ARDOUR::StrongRouteNotificationList&);
- void notify_transport_state_changed();
+ void notify_metering_state_changed();
private:
Button* _solo;
@@ -99,6 +99,8 @@ private:
int _index;
Surface* _surface;
bool _controls_locked;
+ bool _transport_is_rolling;
+ bool _metering_active;
uint64_t _reset_display_at;
boost::shared_ptr<ARDOUR::Route> _route;
PBD::ScopedConnectionList route_connections;
diff --git a/libs/surfaces/mackie/surface.cc b/libs/surfaces/mackie/surface.cc
index ca8d3904e8..6fb94cba93 100644
--- a/libs/surfaces/mackie/surface.cc
+++ b/libs/surfaces/mackie/surface.cc
@@ -573,8 +573,18 @@ Surface::nth_strip (uint32_t n) const
void
Surface::zero_all ()
{
- // TODO turn off Timecode displays
+ if (_mcp.device_info().has_timecode_display ()) {
+ display_timecode (string (10, '0'), string (10, ' '));
+ }
+
+ if (_mcp.device_info().has_two_character_display()) {
+ show_two_char_display (string (2, ' '), string (2, '.'));
+ }
+ if (_mcp.device_info().has_master_fader ()) {
+ _port->write (_master_fader->zero ());
+ }
+
// zero all strips
for (Strips::iterator it = strips.begin(); it != strips.end(); ++it) {
(*it)->zero();
@@ -591,7 +601,7 @@ Surface::zero_controls ()
}
// turn off global buttons and leds
- // global buttons are only ever on mcu_port, so we don't have
+ // global buttons are only ever on mcu_port, so we don't have
// to figure out which port.
for (Controls::iterator it = controls.begin(); it != controls.end(); ++it) {
@@ -601,12 +611,6 @@ Surface::zero_controls ()
}
}
- if (_number == 0 && _mcp.device_info().has_two_character_display()) {
- // any hardware-specific stuff
- // clear 2-char display
- show_two_char_display (" ");
- }
-
// and the led ring for the master strip
blank_jog_ring ();
}
@@ -847,9 +851,9 @@ Surface::route_is_locked_to_strip (boost::shared_ptr<Route> r) const
}
void
-Surface::notify_transport_state_changed()
+Surface::notify_metering_state_changed()
{
for (Strips::const_iterator s = strips.begin(); s != strips.end(); ++s) {
- (*s)->notify_transport_state_changed ();
+ (*s)->notify_metering_state_changed ();
}
}
diff --git a/libs/surfaces/mackie/surface.h b/libs/surfaces/mackie/surface.h
index b3b931f2be..1e33d117a5 100644
--- a/libs/surfaces/mackie/surface.h
+++ b/libs/surfaces/mackie/surface.h
@@ -146,7 +146,7 @@ public:
void next_jog_mode ();
void set_jog_mode (Mackie::JogWheel::Mode);
- void notify_transport_state_changed();
+ void notify_metering_state_changed();
protected: