summaryrefslogtreecommitdiff
path: root/libs/surfaces/faderport8/fp8_strip.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/surfaces/faderport8/fp8_strip.cc')
-rw-r--r--libs/surfaces/faderport8/fp8_strip.cc124
1 files changed, 94 insertions, 30 deletions
diff --git a/libs/surfaces/faderport8/fp8_strip.cc b/libs/surfaces/faderport8/fp8_strip.cc
index 54180d32b8..3a5b97a1e2 100644
--- a/libs/surfaces/faderport8/fp8_strip.cc
+++ b/libs/surfaces/faderport8/fp8_strip.cc
@@ -178,6 +178,7 @@ FP8Strip::unset_controllables (int which)
{
_peak_meter = boost::shared_ptr<ARDOUR::PeakMeter>();
_redux_ctrl = boost::shared_ptr<ARDOUR::ReadOnlyControl>();
+ _stripable_name.clear ();
if (which & CTRL_FADER) {
set_fader_controllable (boost::shared_ptr<AutomationControl>());
@@ -201,25 +202,44 @@ FP8Strip::unset_controllables (int which)
select_button ().set_blinking (false);
}
if (which & CTRL_TEXT0) {
- set_text_line (0x00, "");
+ set_text_line (0, "");
}
if (which & CTRL_TEXT1) {
- set_text_line (0x01, "");
+ set_text_line (1, "");
}
if (which & CTRL_TEXT2) {
- set_text_line (0x02, "");
+ set_text_line (2, "");
}
if (which & CTRL_TEXT3) {
- set_text_line (0x03, "");
+ set_text_line (3, "");
}
set_bar_mode (4); // Off
}
void
+FP8Strip::set_strip_name ()
+{
+ size_t lb = _base.show_meters () ? 6 : 9;
+ set_text_line (0, _stripable_name.substr (0, lb));
+ set_text_line (1, _stripable_name.length() > lb ? _stripable_name.substr (lb) : "");
+}
+
+void
FP8Strip::set_stripable (boost::shared_ptr<Stripable> s, bool panmode)
{
assert (s);
+ if (_base.show_meters () && _base.show_panner ()) {
+ set_strip_mode (5, true);
+ } else if (_base.show_meters ()) {
+ set_strip_mode (4, true);
+ } else {
+ set_strip_mode (0, true);
+ }
+ if (!_base.show_panner ()) {
+ set_bar_mode (4, true); // Off
+ }
+
if (panmode) {
set_fader_controllable (s->pan_azimuth_control ());
} else {
@@ -251,11 +271,16 @@ FP8Strip::set_stripable (boost::shared_ptr<Stripable> s, bool panmode)
select_button ().set_color (s->presentation_info ().color());
//select_button ().set_blinking (false);
- set_strip_mode (0x05);
- set_text_line (0x00, s->name ());
- set_text_line (0x01, _pan_ctrl ? _pan_ctrl->get_user_string () : "");
- set_text_line (0x02, "");
- set_text_line (0x03, "");
+ _stripable_name = s->name ();
+
+ if (_base.twolinetext ()) {
+ set_text_line (0, s->name ());
+ set_text_line (1, _pan_ctrl ? _pan_ctrl->get_user_string () : "");
+ } else {
+ set_strip_name ();
+ }
+ set_text_line (2, "");
+ set_text_line (3, "");
}
/* *****************************************************************************
@@ -467,10 +492,11 @@ FP8Strip::set_periodic_display_mode (DisplayMode m) {
void
FP8Strip::periodic_update_meter ()
{
+ bool show_meters = _base.show_meters ();
bool have_meter = false;
bool have_panner = false;
- if (_peak_meter) {
+ if (_peak_meter && show_meters) {
have_meter = true;
float dB = _peak_meter->meter_level (0, MeterMCP);
// TODO: deflect meter
@@ -480,7 +506,7 @@ FP8Strip::periodic_update_meter ()
_last_meter = val;
}
- } else {
+ } else if (show_meters) {
if (0 != _last_meter) {
_base.tx_midi2 (0xd0 + _id, 0);
_last_meter = 0;
@@ -488,7 +514,7 @@ FP8Strip::periodic_update_meter ()
}
// show redux only if there's a meter, too (strip display mode 5)
- if (_peak_meter && _redux_ctrl) {
+ if (_peak_meter && _redux_ctrl && show_meters) {
float rx = (1.f - _redux_ctrl->get_parameter ()) * 127.f;
// TODO: deflect redux
int val = std::min (127.f, std::max (0.f, rx));
@@ -496,7 +522,7 @@ FP8Strip::periodic_update_meter ()
_base.tx_midi2 (0xd8 + _id, val & 0x7f);
_last_redux = val;
}
- } else {
+ } else if (show_meters) {
if (0 != _last_redux) {
_base.tx_midi2 (0xd8 + _id, 0);
_last_redux = 0;
@@ -515,28 +541,37 @@ FP8Strip::periodic_update_meter ()
}
} else {
set_bar_mode (4); // Off
- set_text_line (0x02, "");
+ set_text_line (2, "");
}
}
else if (_displaymode == SendDisplay) {
set_bar_mode (4); // Off
if (_fader_ctrl) {
- set_text_line (0x01, value_as_string(_fader_ctrl->desc(), _fader_ctrl->get_value()));
+ set_text_line (1, value_as_string(_fader_ctrl->desc(), _fader_ctrl->get_value()));
} else {
- set_text_line (0x01, "");
+ set_text_line (1, "");
}
} else if (_pan_ctrl) {
- have_panner = true;
+ have_panner = _base.show_panner ();
float panpos = _pan_ctrl->internal_to_interface (_pan_ctrl->get_value());
int val = std::min (127.f, std::max (0.f, panpos * 128.f));
- set_bar_mode (1); // Bipolar
- if (val != _last_barpos) {
+ set_bar_mode (have_panner ? 1 : 4); // Bipolar or Off
+ if (val != _last_barpos && have_panner) {
_base.tx_midi3 (0xb0, 0x30 + _id, val & 0x7f);
_last_barpos = val;
}
- set_text_line (0x01, _pan_ctrl->get_user_string ());
+ if (_base.twolinetext ()) {
+ set_text_line (1, _pan_ctrl->get_user_string ());
+ } else {
+ set_strip_name ();
+ }
} else {
set_bar_mode (4); // Off
+ if (_base.twolinetext ()) {
+ set_text_line (1, "");
+ } else {
+ set_strip_name ();
+ }
}
if (_displaymode == SendDisplay || _displaymode == PluginParam) {
@@ -549,9 +584,9 @@ FP8Strip::periodic_update_meter ()
set_strip_mode (4); // big meters + 3 lines of text (3rd line is large)
}
else if (have_panner) {
- set_strip_mode (0); // 3 lines of text (3rd line is large) + value-bar
+ set_strip_mode (0); // 3 lines of text (3rd line is large + long) + value-bar
} else {
- set_strip_mode (0); // 3 lines of text (3rd line is large) + value-bar
+ set_strip_mode (0); // 3 lines of text (3rd line is large + long) + value-bar
}
}
@@ -561,16 +596,32 @@ FP8Strip::set_strip_mode (uint8_t strip_mode, bool clear)
if (strip_mode == _strip_mode && !clear) {
return;
}
+
_strip_mode = strip_mode;
_base.tx_sysex (3, 0x13, _id, (_strip_mode & 0x07) | (clear ? 0x10 : 0));
+
+ if (clear) {
+ /* work-around, when swiching modes, the FP8 may not
+ * properly redraw long lines. Only update lines 0, 1
+ * (line 2 is timecode, line 3 may be inverted)
+ */
+ _base.tx_text (_id, 0, 0x00, _last_line[0]);
+ _base.tx_text (_id, 1, 0x00, _last_line[1]);
+ }
}
void
-FP8Strip::set_bar_mode (uint8_t bar_mode)
+FP8Strip::set_bar_mode (uint8_t bar_mode, bool force)
{
- if (bar_mode == _bar_mode) {
+ if (bar_mode == _bar_mode && !force) {
return;
}
+
+ if (bar_mode == 4) {
+ _base.tx_midi3 (0xb0, 0x30 + _id, 0);
+ _last_barpos = 0xff;
+ }
+
_bar_mode = bar_mode;
_base.tx_midi3 (0xb0, 0x38 + _id, bar_mode);
}
@@ -587,16 +638,29 @@ FP8Strip::set_text_line (uint8_t line, std::string const& txt, bool inv)
}
void
-FP8Strip::periodic_update_timecode ()
+FP8Strip::periodic_update_timecode (uint32_t m)
{
- if (_id >= 2 && _id < 6) {
- std::string const& tc = _base.timecode();
- //" HH:MM:SS:FF"
+ if (m == 0) {
+ return;
+ }
+ if (m == 3) {
+ bool mc = _id >= 4;
+ std::string const& tc = mc ? _base.musical_time () : _base.timecode();
+ std::string t;
+ if (tc.size () == 12) {
+ t = tc.substr (1 + (_id - (mc ? 4 : 0)) * 3, 2);
+ }
+ set_text_line (2, t);
+ } else if (_id >= 2 && _id < 6) {
+ std::string const& tc = (m == 2) ? _base.musical_time () : _base.timecode();
+ //" HH:MM:SS:FF" or " BR|BT|TI|CK"
std::string t;
if (tc.size () == 12) {
t = tc.substr (1 + (_id - 2) * 3, 2);
}
- set_text_line (0x02, t);
+ set_text_line (2, t);
+ } else {
+ set_text_line (2, "");
}
}
@@ -606,6 +670,6 @@ FP8Strip::periodic ()
periodic_update_fader ();
periodic_update_meter ();
if (_displaymode != PluginSelect && _displaymode != PluginParam) {
- periodic_update_timecode ();
+ periodic_update_timecode (_base.clock_mode ());
}
}