diff options
author | Robin Gareus <robin@gareus.org> | 2017-04-14 13:57:14 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-04-14 19:56:42 +0200 |
commit | 43d9feabd31baaf47d5e0a1e3f1ff52be803346f (patch) | |
tree | f083946d25e8f2caa20e5ee0835a6358a09c9c61 | |
parent | d98f05d335e90563239f9ffac5185ac269be378d (diff) |
cont'd FP8 refinement & details
* Access pan-width via shift, press encoder to reset
* Add "touch-start" to encoder events
* Show plugin-param value-bar
* Sends & well-known ctrls: follow strip-selection
* map "select" to strip-selection in Sends-mode
* Fader group override (via shift)
* Prev/Next button tweaks.
* consistent enum naming ...
-rw-r--r-- | libs/surfaces/faderport8/actions.cc | 50 | ||||
-rw-r--r-- | libs/surfaces/faderport8/faderport8.cc | 133 | ||||
-rw-r--r-- | libs/surfaces/faderport8/faderport8.h | 4 | ||||
-rw-r--r-- | libs/surfaces/faderport8/fp8_base.h | 1 | ||||
-rw-r--r-- | libs/surfaces/faderport8/fp8_strip.cc | 84 | ||||
-rw-r--r-- | libs/surfaces/faderport8/fp8_strip.h | 20 |
6 files changed, 234 insertions, 58 deletions
diff --git a/libs/surfaces/faderport8/actions.cc b/libs/surfaces/faderport8/actions.cc index 949d19a958..536257ca38 100644 --- a/libs/surfaces/faderport8/actions.cc +++ b/libs/surfaces/faderport8/actions.cc @@ -273,8 +273,10 @@ void FaderPort8::button_prev_next (bool next) { switch (_ctrls.nav_mode()) { - case NavMaster: case NavChannel: + select_prev_next (next); + break; + case NavMaster: case NavScroll: bank (!next, false); break; @@ -283,13 +285,17 @@ FaderPort8::button_prev_next (bool next) break; case NavZoom: if (next) { - StepTracksDown (); + VerticalZoomInSelected (); } else { - StepTracksUp (); + VerticalZoomOutSelected (); } break; case NavSection: - // TODO nudge + if (next) { + AccessAction ("Region", "nudge-forward"); + } else { + AccessAction ("Region", "nudge-backward"); + } break; case NavMarker: if (next) { @@ -326,11 +332,15 @@ FaderPort8::button_encoder () ac = session->master_out()->gain_control (); } if (ac) { + if (!ac->touching ()) { + ac->start_touch (ac->session().transport_frame()); + } ac->set_value (ac->normal(), PBD::Controllable::NoGroup); } } break; case NavSection: + // TODO nudge break; case NavMarker: { @@ -402,12 +412,19 @@ FaderPort8::encoder_navigate (bool neg, int steps) if (ac) { double v = ac->internal_to_interface (ac->get_value()); v = std::max (0.0, std::min (1.0, v + steps * (neg ? -.01 : .01))); + if (!ac->touching ()) { + ac->start_touch (ac->session().transport_frame()); + } ac->set_value (ac->interface_to_internal(v), PBD::Controllable::NoGroup); } } break; case NavSection: - // nudge event + if (neg) { + AccessAction ("Common", "nudge-playhead-backward"); + } else { + AccessAction ("Common", "nudge-playhead-forward"); + } break; } } @@ -419,7 +436,23 @@ FaderPort8::button_parameter () switch (_ctrls.fader_mode()) { case ModeTrack: case ModePan: - // pan-width see FaderPort8::encoder_parameter() + { + boost::shared_ptr<Stripable> s = first_selected_stripable(); + if (s) { + boost::shared_ptr<AutomationControl> ac; + if (shift_mod ()) { + ac = s->pan_width_control (); + } else { + ac = s->pan_azimuth_control (); + } + if (ac) { + if (!ac->touching ()) { + ac->start_touch (ac->session().transport_frame()); + } + ac->set_value (ac->normal(), PBD::Controllable::UseGroup); + } + } + } break; case ModePlugins: break; @@ -439,7 +472,7 @@ FaderPort8::encoder_parameter (bool neg, int steps) boost::shared_ptr<Stripable> s = first_selected_stripable(); if (s) { boost::shared_ptr<AutomationControl> ac; - if (_ctrls.button (FP8Controls::BtnParam).is_pressed ()) { + if (shift_mod ()) { ac = s->pan_width_control (); } else { ac = s->pan_azimuth_control (); @@ -447,6 +480,9 @@ FaderPort8::encoder_parameter (bool neg, int steps) if (ac) { double v = ac->internal_to_interface (ac->get_value()); v = std::max (0.0, std::min (1.0, v + steps * (neg ? -.01 : .01))); + if (!ac->touching ()) { + ac->start_touch (ac->session().transport_frame()); + } ac->set_value (ac->interface_to_internal(v), PBD::Controllable::UseGroup); } } diff --git a/libs/surfaces/faderport8/faderport8.cc b/libs/surfaces/faderport8/faderport8.cc index 424742aef0..5429ed29ea 100644 --- a/libs/surfaces/faderport8/faderport8.cc +++ b/libs/surfaces/faderport8/faderport8.cc @@ -493,7 +493,12 @@ FaderPort8::pitchbend_handler (MIDI::Parser &, uint8_t chan, MIDI::pitchbend_t p { debug_2byte_msg ("PB", chan, pb); /* fader 0..16368 (0x3ff0 -- 1024 steps) */ - _ctrls.midi_fader (chan, pb); + bool handled = _ctrls.midi_fader (chan, pb); + /* if Shift key is held while moving a fader (group override), don't lock shift. */ + if (_shift_pressed && handled) { + _shift_connection.disconnect (); + _shift_lock = false; + } } void @@ -829,7 +834,7 @@ struct FP8SortByNewDisplayOrder #ifdef MIXBUS // this can happen with older MB sessions (no PresentationInfo::Mixbus flag) - if (cmp_a == cmp_a) { + if (cmp_a == cmp_b) { return a->presentation_info().order() < b->presentation_info().order(); } #endif @@ -902,12 +907,14 @@ FaderPort8::filter_stripables (StripableList& strips) const /* Track/Pan mode: assign stripable to strips */ void -FaderPort8::assign_stripables () +FaderPort8::assign_stripables (bool select_only) { StripableList strips; filter_stripables (strips); - set_periodic_display_mode (FP8Strip::Stripables); + if (!select_only) { + set_periodic_display_mode (FP8Strip::Stripables); + } int n_strips = strips.size(); _channel_off = std::min (_channel_off, n_strips - 8); @@ -930,7 +937,15 @@ FaderPort8::assign_stripables () (*s)->presentation_info ().PropertyChanged.connect (assigned_stripable_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort8::notify_stripable_property_changed, this, boost::weak_ptr<Stripable> (*s), _1), this); - _ctrls.strip(id).set_stripable (*s, _ctrls.fader_mode() == ModePan); + if (select_only) { + _ctrls.strip(id).set_text_line (3, (*s)->name (), true); + _ctrls.strip(id).select_button ().set_color ((*s)->presentation_info ().color()); + /* update selection lights */ + _ctrls.strip(id).select_button ().set_active ((*s)->is_selected ()); + _ctrls.strip(id).select_button ().set_blinking (*s == first_selected_stripable ()); + } else { + _ctrls.strip(id).set_stripable (*s, _ctrls.fader_mode() == ModePan); + } boost::function<void ()> cb (boost::bind (&FaderPort8::select_strip, this, boost::weak_ptr<Stripable> (*s))); _ctrls.strip(id).set_select_cb (cb); @@ -940,7 +955,7 @@ FaderPort8::assign_stripables () } } for (; id < 8; ++id) { - _ctrls.strip(id).unset_controllables(); + _ctrls.strip(id).unset_controllables (select_only ? (FP8Strip::CTRL_SELECT | FP8Strip::CTRL_TEXT3) : FP8Strip::CTRL_ALL); } } @@ -964,7 +979,7 @@ FaderPort8::assign_processor_ctrls () --skip; continue; } - _ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_FADER & ~FP8Strip::CTRL_TEXT1); + _ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_FADER & ~FP8Strip::CTRL_TEXT0); _ctrls.strip(id).set_fader_controllable ((*i).ac); _ctrls.strip(id).set_text_line (0, (*i).name); @@ -1006,6 +1021,9 @@ FaderPort8::build_well_known_processor_ctrls (boost::shared_ptr<Stripable> s, bo void FaderPort8::select_plugin (int num) { + // make sure drop_ctrl_connections() was called + assert (_proc_params.size() == 0 && _showing_well_known == 0); + boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (first_selected_stripable()); if (!r) { _ctrls.set_fader_mode (ModeTrack); @@ -1014,8 +1032,10 @@ FaderPort8::select_plugin (int num) if (num < 0) { build_well_known_processor_ctrls (r, num == -1); assign_processor_ctrls (); + _showing_well_known = num; return; } + _showing_well_known = 0; boost::shared_ptr<Processor> proc = r->nth_plugin (num); if (!proc) { @@ -1038,6 +1058,8 @@ FaderPort8::select_plugin (int num) _proc_params.push_back (ProcessorCtrl (n, proc->automation_control (*i))); } + // TODO: open plugin GUI if (_proc_params.size() > 0) + // display assign_processor_ctrls (); } @@ -1149,6 +1171,7 @@ FaderPort8::spill_plugins () _ctrls.strip(id).set_text_line (0, proc->name()); _ctrls.strip(id).set_text_line (1, pi->plugin()->maker()); _ctrls.strip(id).set_text_line (2, plugintype (pi->type())); + _ctrls.strip(id).set_text_line (3, ""); if (++id == spillwidth) { break; @@ -1170,6 +1193,7 @@ FaderPort8::spill_plugins () _ctrls.strip(id).set_text_line (0, "Comp"); _ctrls.strip(id).set_text_line (1, "Built-In"); _ctrls.strip(id).set_text_line (2, "--"); + _ctrls.strip(id).set_text_line (3, ""); ++id; } if (have_well_known_eq) { @@ -1183,6 +1207,7 @@ FaderPort8::spill_plugins () _ctrls.strip(id).set_text_line (0, "EQ"); _ctrls.strip(id).set_text_line (1, "Built-In"); _ctrls.strip(id).set_text_line (2, "--"); + _ctrls.strip(id).set_text_line (3, ""); ++id; } assert (id == 8); @@ -1209,7 +1234,7 @@ FaderPort8::assign_sends () drop_ctrl_connections (); s->DropReferences.connect (processor_connections, MISSING_INVALIDATOR, boost::bind (&FP8Controls::set_fader_mode, &_ctrls, ModeTrack), this); - set_periodic_display_mode (FP8Strip::PluginParam); + set_periodic_display_mode (FP8Strip::SendDisplay); _plugin_off = std::min (_plugin_off, n_sends - 8); _plugin_off = std::max (0, _plugin_off); @@ -1226,10 +1251,11 @@ FaderPort8::assign_sends () break; } - _ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_FADER & ~FP8Strip::CTRL_TEXT1); + _ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_FADER & ~FP8Strip::CTRL_TEXT0 & ~FP8Strip::CTRL_TEXT1 & ~FP8Strip::CTRL_TEXT3 & ~FP8Strip::CTRL_SELECT); _ctrls.strip(id).set_fader_controllable (send); _ctrls.strip(id).set_text_line (0, s->send_name (i)); - //_ctrls.strip(id).set_mute_controllable (s->send_enable_controllable (i)); // XXX TODO MB assign -> select ? + _ctrls.strip(id).set_mute_controllable (s->send_enable_controllable (i)); + _ctrls.strip(id).set_solo_controllable (s->master_send_enable_controllable ()); // XXX if (++id == 8) { break; @@ -1237,8 +1263,10 @@ FaderPort8::assign_sends () } // clear remaining for (; id < 8; ++id) { - _ctrls.strip(id).unset_controllables (); + _ctrls.strip(id).unset_controllables (FP8Strip::CTRL_ALL & ~FP8Strip::CTRL_TEXT3 & ~FP8Strip::CTRL_SELECT); } + /* set select buttons */ + assign_stripables (true); } void @@ -1285,6 +1313,7 @@ FaderPort8::drop_ctrl_connections () { _proc_params.clear(); processor_connections.drop_connections (); + _showing_well_known = 0; } void @@ -1327,7 +1356,9 @@ FaderPort8::notify_stripable_added_or_removed () /* called by * - DropReferences * - session->RouteAdded - * - PresentationInfo::Change -> Properties::hidden + * - PresentationInfo::Change + * - Properties::hidden + * - Properties::order */ assign_strips (false); } @@ -1340,7 +1371,7 @@ FaderPort8::select_strip (boost::weak_ptr<Stripable> ws) if (!s) { return; } - if (_shift_pressed) { + if (shift_mod ()) { if (s->is_selected ()) { RemoveStripableFromSelection (s); } else { @@ -1385,7 +1416,17 @@ FaderPort8::notify_stripable_property_changed (boost::weak_ptr<Stripable> ws, co } if (what_changed.contains (Properties::name)) { - _ctrls.strip(id).set_text_line (0, s->name()); + switch (_ctrls.fader_mode ()) { + case ModeSend: + _ctrls.strip(id).set_text_line (0, s->name()); + case ModeTrack: + case ModePan: + _ctrls.strip(id).set_text_line (3, s->name(), true); + break; + case ModePlugins: + assert (0); + break; + } } } @@ -1396,19 +1437,23 @@ FaderPort8::gui_track_selection_changed (/*ARDOUR::StripableNotificationListPtr* switch (_ctrls.fader_mode ()) { case ModePlugins: - if (_proc_params.size () > 0) { - ; // TODO w/"well-known" -> re-assign to new strip ?! - } else { - notify_fader_mode_changed (); + if (_proc_params.size () > 0 && _showing_well_known < 0) { + /* w/well-known -> re-assign to new strip */ + int wk = _showing_well_known; + drop_ctrl_connections (); + select_plugin (wk); } return; case ModeSend: - notify_automation_mode_changed (); + _plugin_off = 0; + assign_sends (); return; - default: + case ModeTrack: + case ModePan: break; } + /* update selection lights */ for (StripAssignmentMap::const_iterator i = _assigned_strips.begin(); i != _assigned_strips.end(); ++i) { boost::shared_ptr<ARDOUR::Stripable> s = i->first; uint8_t id = i->second; @@ -1417,6 +1462,7 @@ FaderPort8::gui_track_selection_changed (/*ARDOUR::StripableNotificationListPtr* _ctrls.strip(id).select_button ().set_blinking (sel && s == first_selected_stripable ()); } + /* track automation-mode of primary selection */ boost::shared_ptr<Stripable> s = first_selected_stripable(); if (s) { boost::shared_ptr<AutomationControl> ac; @@ -1429,6 +1475,7 @@ FaderPort8::gui_track_selection_changed (/*ARDOUR::StripableNotificationListPtr* ac->alist()->automation_state_changed.connect (automation_state_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort8::notify_automation_mode_changed, this), this); } } + /* set lights */ notify_automation_mode_changed (); } @@ -1467,6 +1514,49 @@ FaderPort8::move_selected_into_view () } void +FaderPort8::select_prev_next (bool next) +{ + StripableList strips; + filter_stripables (strips); + + boost::shared_ptr<Stripable> selected = first_selected_stripable (); + if (!selected) { + if (strips.size() > 0) { + if (next) { + SetStripableSelection (strips.front ()); + } else { + SetStripableSelection (strips.back ()); + } + } + return; + } + + bool found = false; + boost::shared_ptr<Stripable> toselect; + for (StripableList::const_iterator s = strips.begin(); s != strips.end(); ++s) { + if (*s == selected) { + if (!next) { + found = true; + break; + } + ++s; + if (s != strips.end()) { + toselect = *s; + found = true; + } + break; + } + if (!next) { + toselect = *s; + } + } + + if (found && toselect) { + SetStripableSelection (toselect); + } +} + +void FaderPort8::bank (bool down, bool page) { int dt = page ? 8 : 1; @@ -1495,6 +1585,9 @@ FaderPort8::bank_param (bool down, bool page) spill_plugins (); } break; + case ModeSend: + assign_sends (); + break; default: break; } diff --git a/libs/surfaces/faderport8/faderport8.h b/libs/surfaces/faderport8/faderport8.h index 64b5b4decc..d4ab0c7ccc 100644 --- a/libs/surfaces/faderport8/faderport8.h +++ b/libs/surfaces/faderport8/faderport8.h @@ -136,12 +136,13 @@ private: void notify_stripable_added_or_removed (); void notify_fader_mode_changed (); void filter_stripables (ARDOUR::StripableList& strips) const; - void assign_stripables (); + void assign_stripables (bool select_only = false); void set_periodic_display_mode (FP8Strip::DisplayMode); void assign_strips (bool reset_bank); void bank (bool down, bool page); void move_selected_into_view (); + void select_prev_next (bool next); void assign_sends (); void spill_plugins (); @@ -189,6 +190,7 @@ private: boost::shared_ptr<ARDOUR::AutomationControl> ac; }; std::list <ProcessorCtrl> _proc_params; + int _showing_well_known; /* **************************************************************************/ /* periodic updates, parameter poll */ diff --git a/libs/surfaces/faderport8/fp8_base.h b/libs/surfaces/faderport8/fp8_base.h index b0d5df4923..753440c70b 100644 --- a/libs/surfaces/faderport8/fp8_base.h +++ b/libs/surfaces/faderport8/fp8_base.h @@ -38,6 +38,7 @@ public: virtual size_t tx_midi (std::vector<uint8_t> const&) const = 0; virtual std::string const& timecode () const = 0; + virtual bool shift_mod () const = 0; size_t tx_midi2 (uint8_t sb, uint8_t d1) const { diff --git a/libs/surfaces/faderport8/fp8_strip.cc b/libs/surfaces/faderport8/fp8_strip.cc index 68a9e7262b..e81054c218 100644 --- a/libs/surfaces/faderport8/fp8_strip.cc +++ b/libs/surfaces/faderport8/fp8_strip.cc @@ -49,7 +49,7 @@ FP8Strip::FP8Strip (FP8Base& b, uint8_t id) assert (id < 8); _last_fader = 65535; - _last_meter = _last_redux = _last_panpos = 0xff; + _last_meter = _last_redux = _last_barpos = 0xff; _mute.StateChange.connect_same_thread (_button_connections, boost::bind (&FP8Strip::set_mute, this, _1)); _solo.StateChange.connect_same_thread (_button_connections, boost::bind (&FP8Strip::set_solo, this, _1)); @@ -91,7 +91,7 @@ FP8Strip::initialize () /* clear cached values */ _last_fader = 65535; - _last_meter = _last_redux = _last_panpos = 0xff; + _last_meter = _last_redux = _last_barpos = 0xff; select_button ().set_color (0xffffffff); select_button ().set_active (false); @@ -166,7 +166,6 @@ FP8Strip::unset_controllables (int which) set_rec_controllable (boost::shared_ptr<AutomationControl>()); } if (which & CTRL_PAN) { - set_bar_mode (4); // off set_pan_controllable (boost::shared_ptr<AutomationControl>()); } if (which & CTRL_SELECT) { @@ -175,18 +174,19 @@ FP8Strip::unset_controllables (int which) select_button ().set_active (false); select_button ().set_blinking (false); } - if (which & CTRL_TEXT1) { + if (which & CTRL_TEXT0) { set_text_line (0x00, ""); } - if (which & CTRL_TEXT2) { + if (which & CTRL_TEXT1) { set_text_line (0x01, ""); } - if (which & CTRL_TEXT3) { + if (which & CTRL_TEXT2) { set_text_line (0x02, ""); } - if (which & CTRL_TEXT4) { + if (which & CTRL_TEXT3) { set_text_line (0x03, ""); } + set_bar_mode (4); // Off } void @@ -252,7 +252,9 @@ FP8Strip::midi_touch (bool t) return false; } if (t) { - ac->start_touch (ac->session().transport_frame()); + if (!ac->touching ()) { + ac->start_touch (ac->session().transport_frame()); + } } else { ac->stop_touch (true, ac->session().transport_frame()); } @@ -270,7 +272,10 @@ FP8Strip::midi_fader (float val) if (!ac) { return false; } - ac->set_value (ac->interface_to_internal (val), PBD::Controllable::UseGroup); + if (!ac->touching ()) { + ac->start_touch (ac->session().transport_frame()); + } + ac->set_value (ac->interface_to_internal (val), group_mode ()); return true; } @@ -278,6 +283,16 @@ FP8Strip::midi_fader (float val) * Actions from Controller, Update Model */ +PBD::Controllable::GroupControlDisposition +FP8Strip::group_mode () const +{ + if (_base.shift_mod ()) { + return PBD::Controllable::InverseGroup; + } else { + return PBD::Controllable::UseGroup; + } +} + void FP8Strip::set_mute (bool on) { @@ -285,7 +300,7 @@ FP8Strip::set_mute (bool on) if (!_mute_ctrl->touching ()) { _mute_ctrl->start_touch (_mute_ctrl->session().transport_frame()); } - _mute_ctrl->set_value (on ? 1.0 : 0.0, PBD::Controllable::UseGroup); + _mute_ctrl->set_value (on ? 1.0 : 0.0, group_mode ()); } } @@ -296,7 +311,7 @@ FP8Strip::set_solo (bool on) if (!_solo_ctrl->touching ()) { _solo_ctrl->start_touch (_solo_ctrl->session().transport_frame()); } - _solo_ctrl->set_value (on ? 1.0 : 0.0, PBD::Controllable::UseGroup); + _solo_ctrl->set_value (on ? 1.0 : 0.0, group_mode ()); } } @@ -305,7 +320,7 @@ FP8Strip::set_recarm () { if (_rec_ctrl) { const bool on = !recarm_button().is_active(); - _rec_ctrl->set_value (on ? 1.0 : 0.0, PBD::Controllable::UseGroup); + _rec_ctrl->set_value (on ? 1.0 : 0.0, group_mode ()); } } @@ -395,6 +410,15 @@ FP8Strip::periodic_update_fader () } void +FP8Strip::set_periodic_display_mode (DisplayMode m) { + _displaymode = m; + if (_displaymode == SendDisplay) { + // need to change to 4 lines before calling set_text() + set_strip_mode (2); // 4 lines of small text + } +} + +void FP8Strip::periodic_update_meter () { bool have_meter = false; @@ -434,6 +458,21 @@ FP8Strip::periodic_update_meter () } if (_displaymode == PluginParam) { + if (_fader_ctrl) { + set_bar_mode (2); // Fill + set_text_line (0x01, value_as_string(_fader_ctrl->desc(), _fader_ctrl->get_value())); + float barpos = _fader_ctrl->internal_to_interface (_fader_ctrl->get_value()); + int val = std::min (127.f, std::max (0.f, barpos * 128.f)); + if (val != _last_barpos) { + _base.tx_midi3 (0xb0, 0x30 + _id, val & 0x7f); + _last_barpos = val; + } + } else { + set_bar_mode (4); // Off + set_text_line (0x01, ""); + } + } + 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())); @@ -445,25 +484,28 @@ FP8Strip::periodic_update_meter () 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_panpos) { + if (val != _last_barpos) { _base.tx_midi3 (0xb0, 0x30 + _id, val & 0x7f); - _last_panpos = val; + _last_barpos = val; } set_text_line (0x01, _pan_ctrl->get_user_string ()); } else { set_bar_mode (4); // Off } - if (have_meter && have_panner) { - set_strip_mode (5); // small meter mode + if (_displaymode == SendDisplay) { + set_strip_mode (2); // 4 lines of small text + value-bar + } + else if (have_meter && have_panner) { + set_strip_mode (5); // small meters + 3 lines of text (3rd is large) + value-bar } else if (have_meter) { - set_strip_mode (4); // big meter mode + 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 + value + set_strip_mode (0); // 3 lines of text (3rd line is large) + value-bar } else { - set_strip_mode (0); // 3 lines of text + value + set_strip_mode (0); // 3 lines of text (3rd line is large) + value-bar } } @@ -489,13 +531,13 @@ FP8Strip::set_bar_mode (uint8_t bar_mode) } void -FP8Strip::set_text_line (uint8_t line, std::string const& txt) +FP8Strip::set_text_line (uint8_t line, std::string const& txt, bool inv) { assert (line < 4); if (_last_line[line] == txt) { return; } - _base.tx_text (_id, line, 0x00, txt); + _base.tx_text (_id, line, inv ? 0x04 : 0x00, txt); _last_line[line] = txt; } diff --git a/libs/surfaces/faderport8/fp8_strip.h b/libs/surfaces/faderport8/fp8_strip.h index fd6d7d10dd..999d807313 100644 --- a/libs/surfaces/faderport8/fp8_strip.h +++ b/libs/surfaces/faderport8/fp8_strip.h @@ -23,6 +23,7 @@ #include <boost/shared_ptr.hpp> #include "pbd/signals.h" +#include "pbd/controllable.h" #include "fp8_base.h" #include "fp8_button.h" @@ -59,15 +60,14 @@ public: Stripables, PluginSelect, // no clock display PluginParam, // param value + SendDisplay, // param value + select-bar }; - void set_periodic_display_mode (DisplayMode m) { - _displaymode = m; - } + void set_periodic_display_mode (DisplayMode m); // convenience function to call all set_XXX_controllable void set_stripable (boost::shared_ptr<ARDOUR::Stripable>, bool panmode); - void set_text_line (uint8_t, std::string const&); + void set_text_line (uint8_t, std::string const&, bool inv = false); enum CtrlMask { CTRL_FADER = 0x001, @@ -76,10 +76,10 @@ public: CTRL_REC = 0x004, CTRL_PAN = 0x008, CTRL_SELECT = 0x010, - CTRL_TEXT1 = 0x100, - CTRL_TEXT2 = 0x200, - CTRL_TEXT3 = 0x400, - CTRL_TEXT4 = 0x800, + CTRL_TEXT0 = 0x100, + CTRL_TEXT1 = 0x200, + CTRL_TEXT2 = 0x400, + CTRL_TEXT3 = 0x800, CTRL_TEXT = 0xf00, CTRL_ALL = 0xfff, @@ -123,6 +123,8 @@ private: boost::shared_ptr<ARDOUR::ReadOnlyControl> _redux_ctrl; boost::function<void ()> _select_plugin_functor; + PBD::Controllable::GroupControlDisposition group_mode () const; + /* notifications, update view */ void notify_fader_changed (); void notify_solo_changed (); @@ -146,7 +148,7 @@ private: unsigned short _last_fader; uint8_t _last_meter; uint8_t _last_redux; - uint8_t _last_panpos; + uint8_t _last_barpos; /* display */ void set_strip_mode (uint8_t, bool clear = false); |