Fix various MIDI control and installation issues:
[ardour.git] / libs / surfaces / mackie / mackie_control_protocol.cc
index c9f67a6bef6d11ea8accf089f03c893c5163427e..5fef10fac49cc5baffd26713a327ef01a54a7e82 100644 (file)
@@ -571,6 +571,7 @@ void MackieControlProtocol::connect_session_signals()
        connections_back = session->TransportStateChange.connect( ( mem_fun (*this, &MackieControlProtocol::notify_transport_state_changed) ) );
        // receive punch-in and punch-out
        connections_back = Config->ParameterChanged.connect( ( mem_fun (*this, &MackieControlProtocol::notify_parameter_changed) ) );
+       session->config.ParameterChanged.connect ( ( mem_fun (*this, &MackieControlProtocol::notify_parameter_changed) ) );
        // receive rude solo changed
        connections_back = session->SoloActive.connect( ( mem_fun (*this, &MackieControlProtocol::notify_solo_active_changed) ) );
        
@@ -590,7 +591,7 @@ void MackieControlProtocol::add_port( MIDI::Port & midi_port, int number )
        cout << "MIDI::Port::ALSA_Sequencer " << MIDI::Port::ALSA_Sequencer << endl;
        cout << "MIDI::Port::Unknown " << MIDI::Port::Unknown << endl;
 #endif
-       if ( string( midi_port.device() ) == string( "ardour" ) )
+       if ( string( midi_port.device() ) == string( "ardour" ) && midi_port.type() == MIDI::Port::ALSA_Sequencer )
        {
                throw MackieControlException( "The Mackie MCU driver will not use a port with device=ardour" );
        }
@@ -659,8 +660,7 @@ void MackieControlProtocol::create_ports()
 
 shared_ptr<Route> MackieControlProtocol::master_route()
 {
-       boost::shared_ptr<IO> mo = session->master_out ();
-       return boost::dynamic_pointer_cast<Route>(mo);
+       return session->master_out ();
 }
 
 Strip & MackieControlProtocol::master_strip()
@@ -806,7 +806,7 @@ XMLNode & MackieControlProtocol::get_state()
        return *node;
 }
 
-int MackieControlProtocol::set_state( const XMLNode & node )
+int MackieControlProtocol::set_state (const XMLNode & node, int version)
 {
 #ifdef DEBUG
        cout << "MackieControlProtocol::set_state: active " << _active << endl;
@@ -909,14 +909,14 @@ void MackieControlProtocol::handle_control_event( SurfacePort & port, Control &
                case Control::type_pot:
                        if ( control.group().is_strip() )
                        {
-                               if ( route != 0 )
+                               if ( route != 0 && route->panner() )
                                {
                                        // pan for mono input routes, or stereo linked panners
-                                       if ( route->panner().npanners() == 1 || ( route->panner().npanners() == 2 && route->panner().linked() ) )
+                                       if ( route->panner()->npanners() == 1 || ( route->panner()->npanners() == 2 && route->panner()->linked() ) )
                                        {
                                                // assume pan for now
                                                float xpos;
-                                               route->panner().streampanner (0).get_effective_position (xpos);
+                                               route->panner()->streampanner (0).get_effective_position (xpos);
                                                
                                                // calculate new value, and trim
                                                xpos += state.delta * state.sign;
@@ -925,7 +925,7 @@ void MackieControlProtocol::handle_control_event( SurfacePort & port, Control &
                                                else if ( xpos < 0.0 )
                                                        xpos = 0.0;
                                                
-                                               route->panner().streampanner (0).set_position( xpos );
+                                               route->panner()->streampanner (0).set_position( xpos );
                                        }
                                }
                                else
@@ -998,7 +998,7 @@ void MackieControlProtocol::notify_record_enable_changed( RouteSignal * route_si
        }
 }
 
-void MackieControlProtocol::notify_active_changed( RouteSignal * route_signal )
+void MackieControlProtocol::notify_active_changed (RouteSignal *)
 {
        try
        {
@@ -1070,11 +1070,11 @@ void MackieControlProtocol::notify_panner_changed( RouteSignal * route_signal, b
        try
        {
                Pot & pot = route_signal->strip().vpot();
-               const Panner & panner = route_signal->route()->panner();
-               if ( panner.npanners() == 1 || ( panner.npanners() == 2 && panner.linked() ) )
+               boost::shared_ptr<Panner> panner = route_signal->route()->panner();
+               if ( (panner && panner->npanners() == 1) || ( panner->npanners() == 2 && panner->linked() ) )
                {
                        float pos;
-                       route_signal->route()->panner().streampanner(0).get_effective_position( pos );
+                       route_signal->route()->panner()->streampanner(0).get_effective_position( pos );
                        
                        // cache the MidiByteArray here, because the mackie led control is much lower
                        // resolution than the panner control. So we save lots of byte
@@ -1107,10 +1107,12 @@ void MackieControlProtocol::update_automation( RouteSignal & rs )
                notify_gain_changed( &rs, false );
        }
        
-       ARDOUR::AutoState panner_state = rs.route()->panner().automation_state();
-       if ( panner_state == Touch || panner_state == Play )
-       {
-               notify_panner_changed( &rs, false );
+       if ( rs.route()->panner() ) {
+               ARDOUR::AutoState panner_state = rs.route()->panner()->automation_state();
+               if ( panner_state == Touch || panner_state == Play )
+               {
+                       notify_panner_changed( &rs, false );
+               }
        }
        _automation_last.start();
 }
@@ -1219,7 +1221,7 @@ void MackieControlProtocol::poll_session_data()
 // Transport Buttons
 /////////////////////////////////////
 
-LedState MackieControlProtocol::frm_left_press( Button & button )
+LedState MackieControlProtocol::frm_left_press (Button &)
 {
        // can use first_mark_before/after as well
        unsigned long elapsed = _frm_left_last.restart();
@@ -1247,12 +1249,12 @@ LedState MackieControlProtocol::frm_left_press( Button & button )
        return on;
 }
 
-LedState MackieControlProtocol::frm_left_release( Button & button )
+LedState MackieControlProtocol::frm_left_release (Button &)
 {
        return off;
 }
 
-LedState MackieControlProtocol::frm_right_press( Button & button )
+LedState MackieControlProtocol::frm_right_press (Button &)
 {
        // can use first_mark_before/after as well
        Location * loc = session->locations()->first_location_after (
@@ -1262,34 +1264,34 @@ LedState MackieControlProtocol::frm_right_press( Button & button )
        return on;
 }
 
-LedState MackieControlProtocol::frm_right_release( Button & button )
+LedState MackieControlProtocol::frm_right_release (Button &)
 {
        return off;
 }
 
-LedState MackieControlProtocol::stop_press( Button & button )
+LedState MackieControlProtocol::stop_press (Button &)
 {
        session->request_stop();
        return on;
 }
 
-LedState MackieControlProtocol::stop_release( Button & button )
+LedState MackieControlProtocol::stop_release (Button &)
 {
        return session->transport_stopped();
 }
 
-LedState MackieControlProtocol::play_press( Button & button )
+LedState MackieControlProtocol::play_press (Button &)
 {
        session->request_transport_speed( 1.0 );
        return on;
 }
 
-LedState MackieControlProtocol::play_release( Button & button )
+LedState MackieControlProtocol::play_release (Button &)
 {
        return session->transport_rolling();
 }
 
-LedState MackieControlProtocol::record_press( Button & button )
+LedState MackieControlProtocol::record_press (Button &)
 {
        if ( session->get_record_enabled() )
                session->disable_record( false );
@@ -1298,7 +1300,7 @@ LedState MackieControlProtocol::record_press( Button & button )
        return on;
 }
 
-LedState MackieControlProtocol::record_release( Button & button )
+LedState MackieControlProtocol::record_release (Button &)
 {
        if ( session->get_record_enabled() )
        {
@@ -1311,7 +1313,7 @@ LedState MackieControlProtocol::record_release( Button & button )
                return off;
 }
 
-LedState MackieControlProtocol::rewind_press( Button & button )
+LedState MackieControlProtocol::rewind_press (Button &)
 {
        _jog_wheel.push( JogWheel::speed );
        _jog_wheel.transport_direction( -1 );
@@ -1319,7 +1321,7 @@ LedState MackieControlProtocol::rewind_press( Button & button )
        return on;
 }
 
-LedState MackieControlProtocol::rewind_release( Button & button )
+LedState MackieControlProtocol::rewind_release (Button &)
 {
        _jog_wheel.pop();
        _jog_wheel.transport_direction( 0 );
@@ -1330,7 +1332,7 @@ LedState MackieControlProtocol::rewind_release( Button & button )
        return off;
 }
 
-LedState MackieControlProtocol::ffwd_press( Button & button )
+LedState MackieControlProtocol::ffwd_press (Button &)
 {
        _jog_wheel.push( JogWheel::speed );
        _jog_wheel.transport_direction( 1 );
@@ -1338,7 +1340,7 @@ LedState MackieControlProtocol::ffwd_press( Button & button )
        return on;
 }
 
-LedState MackieControlProtocol::ffwd_release( Button & button )
+LedState MackieControlProtocol::ffwd_release (Button &)
 {
        _jog_wheel.pop();
        _jog_wheel.transport_direction( 0 );
@@ -1349,83 +1351,83 @@ LedState MackieControlProtocol::ffwd_release( Button & button )
        return off;
 }
 
-LedState MackieControlProtocol::loop_press( Button & button )
+LedState MackieControlProtocol::loop_press (Button &)
 {
        session->request_play_loop( !session->get_play_loop() );
        return on;
 }
 
-LedState MackieControlProtocol::loop_release( Button & button )
+LedState MackieControlProtocol::loop_release (Button &)
 {
        return session->get_play_loop();
 }
 
-LedState MackieControlProtocol::punch_in_press( Button & button )
+LedState MackieControlProtocol::punch_in_press (Button &)
 {
-       bool state = !Config->get_punch_in();
-       Config->set_punch_in( state );
+       bool state = !session->config.get_punch_in();
+       session->config.set_punch_in( state );
        return state;
 }
 
-LedState MackieControlProtocol::punch_in_release( Button & button )
+LedState MackieControlProtocol::punch_in_release (Button &)
 {
-       return Config->get_punch_in();
+       return session->config.get_punch_in();
 }
 
-LedState MackieControlProtocol::punch_out_press( Button & button )
+LedState MackieControlProtocol::punch_out_press (Button &)
 {
-       bool state = !Config->get_punch_out();
-       Config->set_punch_out( state );
+       bool state = !session->config.get_punch_out();
+       session->config.set_punch_out( state );
        return state;
 }
 
-LedState MackieControlProtocol::punch_out_release( Button & button )
+LedState MackieControlProtocol::punch_out_release (Button &)
 {
-       return Config->get_punch_out();
+       return session->config.get_punch_out();
 }
 
-LedState MackieControlProtocol::home_press( Button & button )
+LedState MackieControlProtocol::home_press (Button &)
 {
        session->goto_start();
        return on;
 }
 
-LedState MackieControlProtocol::home_release( Button & button )
+LedState MackieControlProtocol::home_release (Button &)
 {
        return off;
 }
 
-LedState MackieControlProtocol::end_press( Button & button )
+LedState MackieControlProtocol::end_press (Button &)
 {
        session->goto_end();
        return on;
 }
 
-LedState MackieControlProtocol::end_release( Button & button )
+LedState MackieControlProtocol::end_release (Button &)
 {
        return off;
 }
 
-LedState MackieControlProtocol::clicking_press( Button & button )
+LedState MackieControlProtocol::clicking_press (Button &)
 {
        bool state = !Config->get_clicking();
        Config->set_clicking( state );
        return state;
 }
 
-LedState MackieControlProtocol::clicking_release( Button & button )
+LedState MackieControlProtocol::clicking_release (Button &)
 {
        return Config->get_clicking();
 }
 
-LedState MackieControlProtocol::global_solo_press( Button & button )
+LedState MackieControlProtocol::global_solo_press (Button &)
 {
        bool state = !session->soloing();
        session->set_all_solo ( state );
        return state;
 }
 
-LedState MackieControlProtocol::global_solo_release( Button & button )
+LedState MackieControlProtocol::global_solo_release (Button &)
 {
        return session->soloing();
 }
@@ -1434,25 +1436,24 @@ LedState MackieControlProtocol::global_solo_release( Button & button )
 // Session signals
 ///////////////////////////////////////////
 
-void MackieControlProtocol::notify_parameter_changed( const char * name_str )
+void MackieControlProtocol::notify_parameter_changed (std::string const & p)
 {
-       string name( name_str );
-       if ( name == "punch-in" )
+       if ( p == "punch-in" )
        {
-               update_global_button( "punch_in", Config->get_punch_in() );
+               update_global_button( "punch_in", session->config.get_punch_in() );
        }
-       else if ( name == "punch-out" )
+       else if ( p == "punch-out" )
        {
-               update_global_button( "punch_out", Config->get_punch_out() );
+               update_global_button( "punch_out", session->config.get_punch_out() );
        }
-       else if ( name == "clicking" )
+       else if ( p == "clicking" )
        {
                update_global_button( "clicking", Config->get_clicking() );
        }
        else
        {
 #ifdef DEBUG
-               cout << "parameter changed: " << name << endl;
+               cout << "parameter changed: " << p << endl;
 #endif
        }
 }
@@ -1528,7 +1529,7 @@ void MackieControlProtocol::notify_transport_state_changed()
 /////////////////////////////////////
 // Bank Switching
 /////////////////////////////////////
-LedState MackieControlProtocol::left_press( Button & button )
+LedState MackieControlProtocol::left_press (Button &)
 {
        Sorted sorted = get_sorted_routes();
        if ( sorted.size() > route_table.size() )
@@ -1549,12 +1550,12 @@ LedState MackieControlProtocol::left_press( Button & button )
        }
 }
 
-LedState MackieControlProtocol::left_release( Button & button )
+LedState MackieControlProtocol::left_release (Button &)
 {
        return off;
 }
 
-LedState MackieControlProtocol::right_press( Button & button )
+LedState MackieControlProtocol::right_press (Button &)
 {
        Sorted sorted = get_sorted_routes();
        if ( sorted.size() > route_table.size() )
@@ -1575,12 +1576,12 @@ LedState MackieControlProtocol::right_press( Button & button )
        }
 }
 
-LedState MackieControlProtocol::right_release( Button & button )
+LedState MackieControlProtocol::right_release (Button &)
 {
        return off;
 }
 
-LedState MackieControlProtocol::channel_left_press( Button & button )
+LedState MackieControlProtocol::channel_left_press (Button &)
 {
        Sorted sorted = get_sorted_routes();
        if ( sorted.size() > route_table.size() )
@@ -1594,12 +1595,12 @@ LedState MackieControlProtocol::channel_left_press( Button & button )
        }
 }
 
-LedState MackieControlProtocol::channel_left_release( Button & button )
+LedState MackieControlProtocol::channel_left_release (Button &)
 {
        return off;
 }
 
-LedState MackieControlProtocol::channel_right_press( Button & button )
+LedState MackieControlProtocol::channel_right_press (Button &)
 {
        Sorted sorted = get_sorted_routes();
        if ( sorted.size() > route_table.size() )
@@ -1613,7 +1614,7 @@ LedState MackieControlProtocol::channel_right_press( Button & button )
        }
 }
 
-LedState MackieControlProtocol::channel_right_release( Button & button )
+LedState MackieControlProtocol::channel_right_release (Button &)
 {
        return off;
 }
@@ -1621,7 +1622,7 @@ LedState MackieControlProtocol::channel_right_release( Button & button )
 /////////////////////////////////////
 // Functions
 /////////////////////////////////////
-LedState MackieControlProtocol::marker_press( Button & button )
+LedState MackieControlProtocol::marker_press (Button &)
 {
        // cut'n'paste from LocationUI::add_new_location()
        string markername;
@@ -1637,7 +1638,7 @@ LedState MackieControlProtocol::marker_press( Button & button )
        return on;
 }
 
-LedState MackieControlProtocol::marker_release( Button & button )
+LedState MackieControlProtocol::marker_release (Button &)
 {
        return off;
 }
@@ -1689,29 +1690,29 @@ Mackie::LedState MackieControlProtocol::scrub_release( Mackie::Button & )
        ;
 }
 
-LedState MackieControlProtocol::drop_press( Button & button )
+LedState MackieControlProtocol::drop_press (Button &)
 {
        session->remove_last_capture();
        return on;
 }
 
-LedState MackieControlProtocol::drop_release( Button & button )
+LedState MackieControlProtocol::drop_release (Button &)
 {
        return off;
 }
 
-LedState MackieControlProtocol::save_press( Button & button )
+LedState MackieControlProtocol::save_press (Button &)
 {
        session->save_state( "" );
        return on;
 }
 
-LedState MackieControlProtocol::save_release( Button & button )
+LedState MackieControlProtocol::save_release (Button &)
 {
        return off;
 }
 
-LedState MackieControlProtocol::smpte_beats_press( Button & )
+LedState MackieControlProtocol::smpte_beats_press (Button &)
 {
        switch ( _timecode_type )
        {