MCP: reverse operation of cursor up/down in zoom mode; more tracign for vpot
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 11 Apr 2012 22:32:02 +0000 (22:32 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 11 Apr 2012 22:32:02 +0000 (22:32 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@11920 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/surfaces/mackie/mackie_control_protocol.h
libs/surfaces/mackie/mcp_buttons.cc
libs/surfaces/mackie/strip.cc
libs/surfaces/mackie/strip.h
libs/surfaces/mackie/surface.cc

index 2168bff82aa2ca06aa4ed3a37816023082a445b3..bdc943a62bf9af3c9f54e747f018b7c8f773f037 100644 (file)
@@ -101,10 +101,10 @@ class MackieControlProtocol
        };
 
        enum FlipMode {
-               Normal,
-               Mirror,
-               Swap,
-               Zero,
+               Normal, /* fader controls primary, vpot controls secondary */
+               Mirror, /* fader + vpot control secondary */
+               Swap,   /* fader controls secondary, vpot controls primary */
+               Zero,   /* fader controls primary, but doesn't move, vpot controls secondary */
        };
        
        MackieControlProtocol(ARDOUR::Session &);
index 76089f8f3d9ba111b0fb8efc5c747f4ef0a11315..6e8ad5f19876116f0ebc2aeb0cf9413ea76b0efc 100644 (file)
@@ -202,10 +202,11 @@ LedState
 MackieControlProtocol::cursor_up_press (Button&)
 {
        if (_zoom_mode) {
+               
                if (_modifier_state & MODIFIER_OPTION) {
-                       VerticalZoomOutSelected (); /* EMIT SIGNAL */
+                       VerticalZoomInSelected (); /* EMIT SIGNAL */
                } else {
-                       VerticalZoomOutAll (); /* EMIT SIGNAL */
+                       VerticalZoomInAll (); /* EMIT SIGNAL */
                }
        }
        return off;
@@ -221,11 +222,10 @@ LedState
 MackieControlProtocol::cursor_down_press (Button&)
 {
        if (_zoom_mode) {
-               
                if (_modifier_state & MODIFIER_OPTION) {
-                       VerticalZoomInSelected (); /* EMIT SIGNAL */
+                       VerticalZoomOutSelected (); /* EMIT SIGNAL */
                } else {
-                       VerticalZoomInAll (); /* EMIT SIGNAL */
+                       VerticalZoomOutAll (); /* EMIT SIGNAL */
                }
        }
        return off;
index 24d3e4ac31fb5755c944d9824d5284893360238a..fc11334df9cbc9a2a2dd529cc32c2a7c300f1053 100644 (file)
@@ -66,10 +66,12 @@ Strip::Strip (Surface& s, const std::string& name, int index, StripControlDefini
        , _vselect (0)
        , _fader_touch (0)
        , _vpot (0)
-       , _gain (0)
+       , _fader (0)
        , _index (index)
        , _surface (&s)
        , _route_locked (false)
+       , _last_fader_position_written (-1.0)
+       , _last_vpot_position_written (-1.0)
 {
        /* build the controls for this track, which will automatically add them
           to the Group 
@@ -100,7 +102,7 @@ void Strip::add (Control & control)
 
        if ((fader = dynamic_cast<Fader*>(&control)) != 0) {
 
-               _gain = fader;
+               _fader = fader;
 
        } else if ((pot = dynamic_cast<Pot*>(&control)) != 0) {
 
@@ -144,110 +146,6 @@ void Strip::add (Control & control)
        }
 }
 
-Fader& 
-Strip::gain()
-{
-       if  (_gain == 0) {
-               throw MackieControlException ("gain is null");
-       }
-       return *_gain;
-}
-
-Pot& 
-Strip::vpot()
-{
-       if  (_vpot == 0) {
-               throw MackieControlException ("vpot is null");
-       }
-       return *_vpot;
-}
-
-Button& 
-Strip::recenable()
-{
-       if  (_recenable == 0) {
-               throw MackieControlException ("recenable is null");
-       }
-       return *_recenable;
-}
-
-Button& 
-Strip::solo()
-{
-       if  (_solo == 0) {
-               throw MackieControlException ("solo is null");
-       }
-       return *_solo;
-}
-Button& 
-Strip::mute()
-{
-       if  (_mute == 0) {
-               throw MackieControlException ("mute is null");
-       }
-       return *_mute;
-}
-
-Button& 
-Strip::select()
-{
-       if  (_select == 0) {
-               throw MackieControlException ("select is null");
-       }
-       return *_select;
-}
-
-Button& 
-Strip::vselect()
-{
-       if  (_vselect == 0) {
-               throw MackieControlException ("vselect is null");
-       }
-       return *_vselect;
-}
-
-Button& 
-Strip::fader_touch()
-{
-       if  (_fader_touch == 0) {
-               throw MackieControlException ("fader_touch is null");
-       }
-       return *_fader_touch;
-}
-
-Meter& 
-Strip::meter()
-{
-       if  (_meter == 0) {
-               throw MackieControlException ("meter is null");
-       }
-       return *_meter;
-}
-
-std::ostream & Mackie::operator <<  (std::ostream & os, const Strip & strip)
-{
-       os << typeid (strip).name();
-       os << " { ";
-       os << "has_solo: " << boolalpha << strip.has_solo();
-       os << ", ";
-       os << "has_recenable: " << boolalpha << strip.has_recenable();
-       os << ", ";
-       os << "has_mute: " << boolalpha << strip.has_mute();
-       os << ", ";
-       os << "has_select: " << boolalpha << strip.has_select();
-       os << ", ";
-       os << "has_vselect: " << boolalpha << strip.has_vselect();
-       os << ", ";
-       os << "has_fader_touch: " << boolalpha << strip.has_fader_touch();
-       os << ", ";
-       os << "has_vpot: " << boolalpha << strip.has_vpot();
-       os << ", ";
-       os << "has_gain: " << boolalpha << strip.has_gain();
-       os << " }";
-       
-       return os;
-}
-
 void
 Strip::set_route (boost::shared_ptr<Route> r)
 {
@@ -265,16 +163,15 @@ Strip::set_route (boost::shared_ptr<Route> r)
                                                                   _surface->number(), _index, _route->name()));
                
 
-               if (has_solo()) {
+               if (_solo) {
                        _route->solo_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_solo_changed, this), ui_context());
                }
-               if (has_mute()) {
+
+               if (_mute) {
                        _route->mute_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_mute_changed, this), ui_context());
                }
                
-               if (has_gain()) {
-                       _route->gain_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_gain_changed, this, false), ui_context());
-               }
+               _route->gain_control()->Changed.connect(route_connections, invalidator(), ui_bind (&Strip::notify_gain_changed, this, false), ui_context());
                
                _route->PropertyChanged.connect (route_connections, invalidator(), ui_bind (&Strip::notify_property_changed, this, _1), ui_context());
                
@@ -311,27 +208,12 @@ Strip::set_route (boost::shared_ptr<Route> r)
 void 
 Strip::notify_all()
 {
-       if  (has_solo()) {
-               notify_solo_changed ();
-       }
-       
-       if  (has_mute()) {
-               notify_mute_changed ();
-       }
-       
-       if  (has_gain()) {
-               notify_gain_changed ();
-       }
-       
+       notify_solo_changed ();
+       notify_mute_changed ();
+       notify_gain_changed ();
        notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name));
-       
-       if  (has_vpot()) {
-               notify_panner_changed ();
-       }
-       
-       if  (has_recenable()) {
-               notify_record_enable_changed ();
-       }
+       notify_panner_changed ();
+       notify_record_enable_changed ();
 }
 
 void 
@@ -377,15 +259,30 @@ Strip::notify_route_deleted ()
 void 
 Strip::notify_gain_changed (bool force_update)
 {
-       if (_route) {
-               Fader & fader = gain();
-
-               if (!fader.in_use()) {
-                       float position = gain_to_slider_position (_route->gain_control()->get_value());
-                       // check that something has actually changed
-                       if (force_update || position != _last_gain_written) {
-                               _surface->write (fader.set_position (position));
-                               _last_gain_written = position;
+       if (_route && _fader) {
+               
+               if (!_fader->in_use()) {
+
+                       double pos;
+
+                       switch (_surface->mcp().flip_mode()) {
+                       case MackieControlProtocol::Swap:
+                               pos = _route->gain_control()->get_value();
+                               return;
+                               
+                       case MackieControlProtocol::Normal:
+                       case MackieControlProtocol::Zero:
+                       case MackieControlProtocol::Mirror:
+                               /* fader is used for something else and/or
+                                  should not move.
+                               */
+                               return;
+                       }
+                       
+                       pos = gain_to_slider_position (pos);
+                       if (force_update || pos != _last_fader_position_written) {
+                               _surface->write (_fader->set_position (pos));
+                               _last_fader_position_written = pos;
                        }
                }
        }
@@ -415,27 +312,32 @@ Strip::notify_property_changed (const PropertyChange& what_changed)
 void 
 Strip::notify_panner_changed (bool force_update)
 {
-       if (_route) {
-               Pot & pot = vpot();
-               boost::shared_ptr<Panner> panner = _route->panner();
+       if (_route && _vpot) {
 
-               if (panner) {
-                       double pos = panner->position ();
+               boost::shared_ptr<Pannable> pannable = _route->pannable();
 
-                       // cache the MidiByteArray here, because the mackie led control is much lower
-                       // resolution than the panner control. So we save lots of byte
-                       // sends in spite of more work on the comparison
+               if (!pannable) {
+                       _surface->write (_vpot->zero());
+                       return;
+               }
 
-                       MidiByteArray bytes = pot.set_all (pos, true, Pot::dot);
+               double pos;
 
-                       // check that something has actually changed
-                       if (force_update || bytes != _last_pan_written)
-                       {
-                               _surface->write (bytes);
-                               _last_pan_written = bytes;
-                       }
-               } else {
-                       _surface->write (pot.zero());
+               switch (_surface->mcp().flip_mode()) {
+               case MackieControlProtocol::Swap:
+                       /* pot is controlling the gain */
+                       return;
+                       
+               case MackieControlProtocol::Normal:
+               case MackieControlProtocol::Zero:
+               case MackieControlProtocol::Mirror:
+                       pos = pannable->pan_azimuth_control->get_value();
+                       break;
+               }
+
+               if (force_update || pos != _last_vpot_position_written) {
+                       _surface->write (_vpot->set_all (pos, true, Pot::dot));
+                       _last_vpot_position_written = pos;
                }
        }
 }
@@ -494,7 +396,7 @@ Strip::handle_button (Button& button, ButtonState bs)
 
                bool state = (bs == press);
 
-               _gain->set_in_use (state);
+               _fader->set_in_use (state);
                
                if (ARDOUR::Config->get_mackie_emulation() == "bcf" && state) {
 
@@ -502,7 +404,7 @@ Strip::handle_button (Button& button, ButtonState bs)
                           their `in_use' state.
                        */
 
-                       _surface->mcp().add_in_use_timeout (*_surface, gain(), &fader_touch());
+                       _surface->mcp().add_in_use_timeout (*_surface, *_fader, _fader_touch);
                }
        }
 }
@@ -512,24 +414,23 @@ Strip::handle_fader (Fader& fader, float position)
 {
        DEBUG_TRACE (DEBUG::MackieControl, string_compose ("fader to %1\n", position));
 
+       if (!_route) {
+               return;
+       }
+
        switch (_surface->mcp().flip_mode()) {
        case MackieControlProtocol::Normal:
+               _route->gain_control()->set_value (slider_position_to_gain (position));
                break;
        case MackieControlProtocol::Zero:
                break;
        case MackieControlProtocol::Mirror:
                break;
        case MackieControlProtocol::Swap:
-               if (_vpot) {
-                       handle_pot (*_vpot, 1.0);
-               }
+               _route->pannable()->pan_azimuth_control->set_value (position);
                return;
        }
 
-       if (_route) {
-               _route->gain_control()->set_value (slider_position_to_gain (position));
-       }
-       
        if (ARDOUR::Config->get_mackie_emulation() == "bcf") {
                /* reset the timeout while we're still moving the fader */
                _surface->mcp().add_in_use_timeout (*_surface, fader, fader.in_use_touch_control);
@@ -554,13 +455,22 @@ Strip::handle_pot (Pot& pot, float delta)
 
        if (pannable) {
                boost::shared_ptr<AutomationControl> ac;
-               
-               if (_surface->mcp().modifier_state() & MackieControlProtocol::MODIFIER_CONTROL) {
-                       ac = pannable->pan_width_control;
-               } else {
-                       ac = pannable->pan_azimuth_control;
+
+               switch (_surface->mcp().flip_mode()) {
+               case MackieControlProtocol::Normal: /* pot controls pan */
+               case MackieControlProtocol::Mirror: /* pot + fader control pan */
+               case MackieControlProtocol::Zero:   /* pot controls pan, faders don't move */
+                       if (_surface->mcp().modifier_state() & MackieControlProtocol::MODIFIER_CONTROL) {
+                               ac = pannable->pan_width_control;
+                       } else {
+                               ac = pannable->pan_azimuth_control;
+                       }
+                       break;
+               case MackieControlProtocol::Swap:
+                       ac = _route->gain_control();
+                       break;
                }
-               
+
                double p = ac->get_value();
                 
                // calculate new value, and adjust
@@ -603,8 +513,10 @@ Strip::update_automation ()
 void
 Strip::update_meter ()
 {
-       float dB = const_cast<PeakMeter&> (_route->peak_meter()).peak_power (0);
-       _surface->write (meter().update_message (dB));
+       if (_meter) {
+               float dB = const_cast<PeakMeter&> (_route->peak_meter()).peak_power (0);
+               _surface->write (_meter->update_message (dB));
+       }
 }
 
 MidiByteArray
index 228daf753f8fe1e1ed3028e745836d2d636dd68c..ec030399a55606114e2d7e35276df618ba6cf198 100644 (file)
@@ -52,26 +52,6 @@ public:
        void add (Control & control);
        int index() const { return _index; } // zero based
        
-       Button & solo();
-       Button & recenable();
-       Button & mute();
-       Button & select();
-       Button & vselect();
-       Button & fader_touch();
-       Pot & vpot();
-       Fader & gain();
-       Meter& meter ();
-
-       bool has_solo() const { return _solo != 0; }
-       bool has_recenable() const { return _recenable != 0; }
-       bool has_mute() const { return _mute != 0; }
-       bool has_select() const { return _select != 0; }
-       bool has_vselect() const { return _vselect != 0; }
-       bool has_fader_touch() const { return _fader_touch != 0; }
-       bool has_vpot() const { return _vpot != 0; }
-       bool has_gain() const { return _gain != 0; }
-       bool has_meter() const { return _meter != 0; }
-
        void set_route (boost::shared_ptr<ARDOUR::Route>);
 
        // call all signal handlers manually
@@ -98,7 +78,7 @@ private:
        Button* _vselect;
        Button* _fader_touch;
        Pot*    _vpot;
-       Fader*  _gain;
+       Fader*  _fader;
        Meter*  _meter;
        int     _index;
        Surface* _surface;
@@ -107,11 +87,8 @@ private:
        boost::shared_ptr<ARDOUR::Route> _route;
        PBD::ScopedConnectionList route_connections;
 
-       // Last written values for the gain and pan, to avoid overloading
-       // the midi connection to the surface
-       float         _last_gain_written;
-       MidiByteArray _last_pan_written;
-
+       float _last_fader_position_written;
+       float _last_vpot_position_written;
 
        void notify_solo_changed ();
        void notify_mute_changed ();
@@ -127,8 +104,6 @@ private:
 
 };
 
-std::ostream & operator <<  (std::ostream &, const Strip &);
-
 }
 
 #endif /* __ardour_mackie_control_protocol_strip_h__ */
index 325a95fe7080fd957af4db4679522c52d3bdcda3..157b78153142ca7084cab51451c55504fe554d5d 100644 (file)
@@ -386,7 +386,7 @@ Surface::handle_midi_note_on_message (MIDI::Parser &, MIDI::EventTwoBytes* ev)
 void 
 Surface::handle_midi_controller_message (MIDI::Parser &, MIDI::EventTwoBytes* ev)
 {
-       DEBUG_TRACE (DEBUG::MackieControl, string_compose ("SurfacePort::handle_midi_controller %1 = %2\n", ev->controller_number, ev->value));
+       DEBUG_TRACE (DEBUG::MackieControl, string_compose ("SurfacePort::handle_midi_controller %1 = %2\n", (int) ev->controller_number, (int) ev->value));
 
        Pot* pot = pots[ev->controller_number];