ActionManager::get_all_actions() no longer includes <Actions> in the paths it returns...
[ardour.git] / libs / surfaces / faderport8 / fp8_strip.cc
index b811e7c88ffdaebf43ec9a2d169059e2d46eb627..080b774c098e9025b9b0fbfc5d60b1b8f946bb42 100644 (file)
 #include "fp8_strip.h"
 
 using namespace ARDOUR;
-using namespace ArdourSurface;
-using namespace ArdourSurface::FP8Types;
+using namespace ArdourSurface::FP_NAMESPACE;
+using namespace ArdourSurface::FP_NAMESPACE::FP8Types;
+
+uint8_t /* static */
+FP8Strip::midi_ctrl_id (CtrlElement type, uint8_t id)
+{
+       assert (id < N_STRIPS);
+       if (id < 8) {
+               switch (type) {
+                       case BtnSolo:
+                               return 0x08 + id;
+                       case BtnMute:
+                               return 0x10 + id;
+                       case BtnSelect:
+                               return 0x18 + id;
+                       case Fader:
+                               return 0xe0 + id;
+                       case Meter:
+                               return 0xd0 + id;
+                       case Redux:
+                               return 0xd8 + id;
+                       case BarVal:
+                               return 0x30 + id;
+                       case BarMode:
+                               return 0x38 + id;
+               }
+       } else {
+               id -= 8;
+               switch (type) {
+                       case BtnSolo:
+                               switch (id) {
+                                       case 3:
+                                               return 0x58;
+                                       case 6:
+                                               return 0x59;
+                                       default:
+                                               return 0x50 + id;
+                               }
+                       case BtnMute:
+                               return 0x78 + id;
+                       case BtnSelect:
+                               if (id == 0) { // strip 8
+                                       return 0x07;
+                               } else {
+                                       return 0x20 + id;
+                               }
+                       case Fader:
+                               return 0xe8 + id;
+                       case Meter:
+                               return 0xc0 + id;
+                       case Redux:
+                               return 0xc8 + id;
+                       case BarVal:
+                               return 0x40 + id;
+                       case BarMode:
+                               return 0x48 + id;
+               }
+       }
+       assert (0);
+       return 0;
+}
 
 FP8Strip::FP8Strip (FP8Base& b, uint8_t id)
        : _base (b)
        , _id (id)
-       , _solo   (b, 0x08 + id)
-       , _mute   (b, 0x10 + id)
-       , _selrec (b, 0x18 + id, true)
+       , _solo   (b, midi_ctrl_id (BtnSolo, id))
+       , _mute   (b, midi_ctrl_id (BtnMute, id))
+       , _selrec (b, midi_ctrl_id (BtnSelect, id), true)
        , _touching (false)
        , _strip_mode (0)
        , _bar_mode (0)
        , _displaymode (Stripables)
 {
-       assert (id < 8);
+       assert (id < N_STRIPS);
 
        _last_fader = 65535;
        _last_meter = _last_redux = _last_barpos = 0xff;
@@ -121,10 +180,10 @@ FP8Strip::initialize ()
 
        set_bar_mode (4); // off
 
-       _base.tx_midi2 (0xd0 + _id, 0); // reset meter
-       _base.tx_midi2 (0xd8 + _id, 0); // reset redux
+       _base.tx_midi2 (midi_ctrl_id (Meter, _id), 0); // reset meter
+       _base.tx_midi2 (midi_ctrl_id (Redux, _id), 0); // reset redux
 
-       _base.tx_midi3 (0xe0 + _id, 0, 0); // fader
+       _base.tx_midi3 (midi_ctrl_id (Fader, _id), 0, 0); // fader
 
        /* clear cached values */
        _last_fader = 65535;
@@ -269,7 +328,8 @@ FP8Strip::set_stripable (boost::shared_ptr<Stripable> s, bool panmode)
 
        set_select_controllable (boost::shared_ptr<AutomationControl>());
        select_button ().set_active (s->is_selected ());
-       select_button ().set_color (s->presentation_info ().color());
+
+       set_select_button_color (s->presentation_info ().color());
        //select_button ().set_blinking (false);
 
        _stripable_name = s->name ();
@@ -297,11 +357,9 @@ FP8Strip::midi_touch (bool t)
                return false;
        }
        if (t) {
-               if (!ac->touching ()) {
-                       ac->start_touch (ac->session().transport_frame());
-               }
+               ac->start_touch (ac->session().transport_sample());
        } else {
-               ac->stop_touch (ac->session().transport_frame());
+               ac->stop_touch (ac->session().transport_sample());
        }
        return true;
 }
@@ -317,9 +375,7 @@ FP8Strip::midi_fader (float val)
        if (!ac) {
                return false;
        }
-       if (ac->automation_state() == Touch && !ac->touching ()) {
-               ac->start_touch (ac->session().transport_frame());
-       }
+       ac->start_touch (ac->session().transport_sample());
        ac->set_value (ac->interface_to_internal (val), group_mode ());
        return true;
 }
@@ -344,9 +400,7 @@ FP8Strip::set_mute (bool on)
        if (!_mute_ctrl) {
                return;
        }
-       if (_mute_ctrl->automation_state() == Touch && !_mute_ctrl->touching ()) {
-               _mute_ctrl->start_touch (_mute_ctrl->session().transport_frame());
-       }
+       _mute_ctrl->start_touch (_mute_ctrl->session().transport_sample());
        _mute_ctrl->set_value (on ? 1.0 : 0.0, group_mode ());
 }
 
@@ -356,9 +410,7 @@ FP8Strip::set_solo (bool on)
        if (!_solo_ctrl) {
                return;
        }
-       if (_solo_ctrl->automation_state() == Touch && !_solo_ctrl->touching ()) {
-               _solo_ctrl->start_touch (_solo_ctrl->session().transport_frame());
-       }
+       _solo_ctrl->start_touch (_solo_ctrl->session().transport_sample());
        _solo_ctrl->set_value (on ? 1.0 : 0.0, group_mode ());
 }
 
@@ -379,9 +431,7 @@ FP8Strip::set_select ()
                assert (!_x_select_ctrl);
                _select_plugin_functor ();
        } else if (_x_select_ctrl) {
-               if (_x_select_ctrl->automation_state() == Touch && !_x_select_ctrl->touching ()) {
-                       _x_select_ctrl->start_touch (_x_select_ctrl->session().transport_frame());
-               }
+               _x_select_ctrl->start_touch (_x_select_ctrl->session().transport_sample());
                const bool on = !select_button ().is_active();
                _x_select_ctrl->set_value (on ? 1.0 : 0.0, group_mode ());
        }
@@ -408,7 +458,7 @@ FP8Strip::notify_fader_changed ()
                return;
        }
        _last_fader = mv;
-       _base.tx_midi3 (0xe0 + _id, (mv & 0x7f), (mv >> 7) & 0x7f);
+       _base.tx_midi3 (midi_ctrl_id (Fader, _id), (mv & 0x7f), (mv >> 7) & 0x7f);
 }
 
 void
@@ -511,13 +561,13 @@ FP8Strip::periodic_update_meter ()
                // TODO: deflect meter
                int val = std::min (127.f, std::max (0.f, 2.f * dB + 127.f));
                if (val != _last_meter || val > 0) {
-                       _base.tx_midi2 (0xd0 + _id, val & 0x7f); // falls off automatically
+                       _base.tx_midi2 (midi_ctrl_id (Meter, _id), val & 0x7f); // falls off automatically
                        _last_meter = val;
                }
 
        } else if (show_meters) {
                if (0 != _last_meter) {
-                       _base.tx_midi2 (0xd0 + _id, 0);
+                       _base.tx_midi2 (midi_ctrl_id (Meter, _id), 0);
                        _last_meter = 0;
                }
        }
@@ -528,12 +578,12 @@ FP8Strip::periodic_update_meter ()
                // TODO: deflect redux
                int val = std::min (127.f, std::max (0.f, rx));
                if (val != _last_redux) {
-                       _base.tx_midi2 (0xd8 + _id, val & 0x7f);
+                       _base.tx_midi2 (midi_ctrl_id (Redux, _id), val & 0x7f);
                        _last_redux = val;
                }
        } else if (show_meters) {
                if (0 != _last_redux) {
-                       _base.tx_midi2 (0xd8 + _id, 0);
+                       _base.tx_midi2 (midi_ctrl_id (Redux, _id), 0);
                        _last_redux = 0;
                }
        }
@@ -545,7 +595,7 @@ FP8Strip::periodic_update_meter ()
                        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);
+                               _base.tx_midi3 (0xb0, midi_ctrl_id (BarVal, _id), val & 0x7f);
                                _last_barpos = val;
                        }
                } else {
@@ -569,7 +619,7 @@ FP8Strip::periodic_update_meter ()
                int val = std::min (127.f, std::max (0.f, panpos * 128.f));
                set_bar_mode (have_panner ? 1 : 4); // Bipolar or Off
                if (val != _last_barpos && have_panner) {
-                       _base.tx_midi3 (0xb0, 0x30 + _id, val & 0x7f);
+                       _base.tx_midi3 (0xb0, midi_ctrl_id (BarVal, _id), val & 0x7f);
                        _last_barpos = val;
                }
                if (_base.twolinetext ()) {
@@ -593,7 +643,10 @@ FP8Strip::periodic_update_meter ()
                set_strip_mode (5); // small meters + 3 lines of text (3rd is large)  + value-bar
        }
        else if (have_meter) {
-               set_strip_mode (4); // big meters + 3 lines of text (3rd line is large)
+               /* we cannot use "big meters" mode 4, since that implies
+                * 2 "Large" (4char) text lines, followed by a HUGE 2 char line
+                * and hides timecode-clock */
+               set_strip_mode (5);
        }
        else if (have_panner) {
                set_strip_mode (0); // 3 lines of text (3rd line is large + long) + value-bar
@@ -630,12 +683,12 @@ FP8Strip::set_bar_mode (uint8_t bar_mode, bool force)
        }
 
        if (bar_mode == 4) {
-               _base.tx_midi3 (0xb0, 0x30 + _id, 0);
+               _base.tx_midi3 (0xb0, midi_ctrl_id (BarVal, _id), 0);
                _last_barpos = 0xff;
        }
 
        _bar_mode = bar_mode;
-       _base.tx_midi3 (0xb0, 0x38 + _id, bar_mode);
+       _base.tx_midi3 (0xb0, midi_ctrl_id (BarMode, _id), bar_mode);
 }
 
 void
@@ -680,8 +733,10 @@ void
 FP8Strip::periodic ()
 {
        periodic_update_fader ();
+#ifndef FADERPORT2
        periodic_update_meter ();
        if (_displaymode != PluginSelect && _displaymode != PluginParam) {
                periodic_update_timecode (_base.clock_mode ());
        }
+#endif
 }