MCP: add handler for forgotten noteOn (button) messages, and more code tidying
authorPaul Davis <paul@linuxaudiosystems.com>
Sun, 8 Apr 2012 20:34:21 +0000 (20:34 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Sun, 8 Apr 2012 20:34:21 +0000 (20:34 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@11834 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/surfaces/mackie/mackie_port.cc
libs/surfaces/mackie/mackie_port.h
libs/surfaces/mackie/route_signal.cc

index d42e9163c910880aebf83962d2c5f069023ddb22..ff2f4aa54fb3f074368c209aa7ab2404d5f836fe 100644 (file)
@@ -272,8 +272,11 @@ void MackiePort::connect_to_signals ()
 
                MIDI::Parser* p = input_port().parser();
 
+               /* V-Pot messages are Controller */
                p->controller.connect_same_thread (*this, boost::bind (&MackiePort::handle_midi_controller_message, this, _1, _2));
-               
+               /* Button messages are NoteOn */
+               p->controller.connect_same_thread (*this, boost::bind (&MackiePort::handle_midi_note_on_message, this, _1, _2));
+               /* Fader messages are Pitchbend */
                p->channel_pitchbend[0].connect_same_thread (*this, boost::bind (&MackiePort::handle_midi_pitchbend_message, this, _1, _2, 0U));
                p->channel_pitchbend[1].connect_same_thread (*this, boost::bind (&MackiePort::handle_midi_pitchbend_message, this, _1, _2, 1U));
                p->channel_pitchbend[2].connect_same_thread (*this, boost::bind (&MackiePort::handle_midi_pitchbend_message, this, _1, _2, 2U));
@@ -340,54 +343,50 @@ MackiePort::handle_midi_pitchbend_message (MIDI::Parser&, MIDI::pitchbend_t pb,
        }
 }
 
+void 
+MackiePort::handle_midi_note_on_message (MIDI::Parser &, MIDI::EventTwoBytes* ev)
+{
+       DEBUG_TRACE (DEBUG::MackieControl, string_compose ("MackiePort::handle_note_on %1 = %2\n", ev->note_number, ev->velocity));
+
+       Control* control = _mcp.surface().buttons[(8*number()) + ev->note_number];
+
+       if (control) {
+               ControlState control_state (ev->velocity == 0x7f ? press : release);
+               control->set_in_use (control_state.button_state == press);
+               control_event (*this, *control, control_state);
+       }
+}
+
 void 
 MackiePort::handle_midi_controller_message (MIDI::Parser &, MIDI::EventTwoBytes* ev)
 {
        DEBUG_TRACE (DEBUG::MackieControl, string_compose ("MackiePort::handle_midi_controller %1 = %2\n", ev->controller_number, ev->value));
 
-       Control* control;
+       Control* control = _mcp.surface().pots[(8*number()) + ev->controller_number];
 
-       switch (ev->controller_number & 0xf0) {
-       case Control::type_button:
-               control = _mcp.surface().buttons[ev->controller_number];
-               if (control) {
-                       control->set_in_use (true);
-                       ControlState control_state (ev->value == 0x7f ? press : release);
-                       control->set_in_use (control_state.button_state == press);
-                       control_event (*this, *control, control_state);
-               }
+       if (control) {
+               ControlState state;
                
-               break;
-
-       case Control::type_pot:
-               control = _mcp.surface().pots[ev->controller_number];
-               if (control) {
-                       ControlState state;
-                       
-                       // bytes[2] & 0b01000000 (0x40) give sign
-                       state.sign = (ev->value & 0x40) == 0 ? 1 : -1; 
-                       // bytes[2] & 0b00111111 (0x3f) gives delta
-                       state.ticks = (ev->value & 0x3f);
-                       if (state.ticks == 0) {
-                               /* euphonix and perhaps other devices send zero
-                                  when they mean 1, we think.
-                               */
-                               state.ticks = 1;
-                       }
-                       state.delta = float (state.ticks) / float (0x3f);
-                       
-                       /* Pots only emit events when they move, not when they
-                          stop moving. So to get a stop event, we need to use a timeout.
+               // bytes[2] & 0b01000000 (0x40) give sign
+               state.sign = (ev->value & 0x40) == 0 ? 1 : -1; 
+               // bytes[2] & 0b00111111 (0x3f) gives delta
+               state.ticks = (ev->value & 0x3f);
+               if (state.ticks == 0) {
+                       /* euphonix and perhaps other devices send zero
+                          when they mean 1, we think.
                        */
-                       
-                       control->set_in_use (true);
-                       _mcp.add_in_use_timeout (*this, *control, control);
-                       control_event (*this, *control, state);
+                       state.ticks = 1;
                }
-               break;
-       
-       default:
-               break;
+               state.delta = float (state.ticks) / float (0x3f);
+               
+               /* Pots only emit events when they move, not when they
+                  stop moving. So to get a stop event, we need to use a timeout.
+               */
+               
+               control->set_in_use (true);
+               _mcp.add_in_use_timeout (*this, *control, control);
+
+               control_event (*this, *control, state);
        }
 }
 
index 086043a1f5552f5c7354d18045a4073a143680bd..1b6b77da93ca01164cba803dc8dd52101c97971e 100644 (file)
@@ -56,6 +56,7 @@ public:
        void handle_midi_sysex( MIDI::Parser &, MIDI::byte *, size_t count );
        void handle_midi_pitchbend_message (MIDI::Parser &, MIDI::pitchbend_t, uint32_t channel_id);
        void handle_midi_controller_message (MIDI::Parser &, MIDI::EventTwoBytes*);
+       void handle_midi_note_on_message (MIDI::Parser &, MIDI::EventTwoBytes*);
        
        /// return the number of strips associated with this port
        virtual int strips() const;
index 4446420cd4f3cb4f395339e516939bc73b747a76..ff617119652d9ab43dc0cbe9c267d6ae565ff959 100644 (file)
@@ -71,33 +71,34 @@ void RouteSignal::connect()
        // RemoteControlIDChanged. Better handled at Session level.
 }
 
-void RouteSignal::disconnect()
+void 
+RouteSignal::disconnect()
 {
        connections.drop_connections ();
 }
 
-void RouteSignal::notify_all()
+void 
+RouteSignal::notify_all()
 {
-#ifdef DEBUG
-       cout << "RouteSignal::notify_all for " << _strip << endl;
-#endif
-       if ( _strip.has_solo() )
-               _mcp.notify_solo_changed( this );
+       if  (_strip.has_solo()) {
+               _mcp.notify_solo_changed (this);
+       }
        
-       if ( _strip.has_mute() )
-               _mcp.notify_mute_changed( this );
+       if  (_strip.has_mute()) {
+               _mcp.notify_mute_changed (this);
+       }
        
-       if ( _strip.has_gain() )
-               _mcp.notify_gain_changed( this );
+       if  (_strip.has_gain()) {
+               _mcp.notify_gain_changed (this);
+       }
        
-       _mcp.notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name), this );
+       _mcp.notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name), this);
        
-       if ( _strip.has_vpot() )
-               _mcp.notify_panner_changed( this );
+       if  (_strip.has_vpot()) {
+               _mcp.notify_panner_changed (this);
+       }
        
-       if ( _strip.has_recenable() )
-               _mcp.notify_record_enable_changed( this );
-#ifdef DEBUG
-       cout << "RouteSignal::notify_all finish" << endl;
-#endif
+       if  (_strip.has_recenable()) {
+               _mcp.notify_record_enable_changed (this);
+       }
 }