delete slave during Session::destroy
[ardour.git] / libs / surfaces / faderport8 / actions.cc
index 21ed2998c31af73a642492bd3396f1da5ad314db..d17059d92d5d0536b253eaab07cc431325a31af1 100644 (file)
@@ -90,6 +90,7 @@ FaderPort8::setup_actions ()
        BindFunction (BtnATouch, released, button_automation, ARDOUR::Touch);
        BindFunction (BtnARead, released, button_automation, ARDOUR::Play);
        BindFunction (BtnAWrite, released, button_automation, ARDOUR::Write);
+       BindFunction (BtnALatch, released, button_automation, ARDOUR::Latch);
 
        _ctrls.button (FP8Controls::BtnEncoder).pressed.connect_same_thread (button_connections, boost::bind (&FaderPort8::button_encoder, this));
        _ctrls.button (FP8Controls::BtnParam).pressed.connect_same_thread (button_connections, boost::bind (&FaderPort8::button_parameter, this));
@@ -307,6 +308,9 @@ void
 FaderPort8::button_solo_clear ()
 {
        bool soloing = session->soloing() || session->listening();
+#ifdef MIXBUS
+       soloing |= session->mixbus_soloed();
+#endif
        if (soloing) {
                StripableList all;
                session->get_stripables (all);
@@ -314,12 +318,12 @@ FaderPort8::button_solo_clear ()
                        if ((*i)->is_master() || (*i)->is_auditioner() || (*i)->is_monitor()) {
                                continue;
                        }
-                       boost::shared_ptr<AutomationControl> ac = (*i)->solo_control();
-                       if (ac && ac->get_value () > 0) {
-                               _solo_state.push_back (boost::weak_ptr<AutomationControl>(ac));
+                       boost::shared_ptr<SoloControl> sc = (*i)->solo_control();
+                       if (sc && sc->self_soloed ()) {
+                               _solo_state.push_back (boost::weak_ptr<AutomationControl>(sc));
                        }
                }
-               AccessAction ("Main", "cancel-solo");
+               cancel_all_solo (); // AccessAction ("Main", "cancel-solo");
        } else {
                /* restore solo */
                boost::shared_ptr<ControlList> cl (new ControlList);
@@ -328,9 +332,7 @@ FaderPort8::button_solo_clear ()
                        if (!ac) {
                                continue;
                        }
-                       if (ac->automation_state() == Touch && !ac->touching ()) {
-                               ac->start_touch (ac->session().transport_frame());
-                       }
+                       ac->start_touch (ac->session().transport_frame());
                        cl->push_back (ac);
                }
                if (!cl->empty()) {
@@ -355,9 +357,7 @@ FaderPort8::button_mute_clear ()
                                continue;
                        }
                        cl->push_back (ac);
-                       if (ac->automation_state() == Touch && !ac->touching ()) {
-                               ac->start_touch (ac->session().transport_frame());
-                       }
+                       ac->start_touch (ac->session().transport_frame());
                }
                if (!cl->empty()) {
                        session->set_controls (cl, 1.0, PBD::Controllable::NoGroup);
@@ -397,9 +397,7 @@ FaderPort8::handle_encoder_pan (int steps)
                        ac = s->pan_azimuth_control ();
                }
                if (ac) {
-                       if (ac->automation_state() == Touch && !ac->touching ()) {
-                               ac->start_touch (ac->session().transport_frame());
-                       }
+                       ac->start_touch (ac->session().transport_frame());
                        if (steps == 0) {
                                ac->set_value (ac->normal(), PBD::Controllable::UseGroup);
                        } else {
@@ -423,9 +421,7 @@ FaderPort8::handle_encoder_link (int steps)
        }
 
        double v = ac->internal_to_interface (ac->get_value());
-       if (ac->automation_state() == Touch && !ac->touching ()) {
-               ac->start_touch (ac->session().transport_frame());
-       }
+       ac->start_touch (ac->session().transport_frame());
 
        if (steps == 0) {
                ac->set_value (ac->normal(), PBD::Controllable::UseGroup);
@@ -532,9 +528,7 @@ FaderPort8::button_encoder ()
                                        ac = session->master_out()->gain_control ();
                                }
                                if (ac) {
-                                       if (ac->automation_state() == Touch && !ac->touching ()) {
-                                               ac->start_touch (ac->session().transport_frame());
-                                       }
+                                       ac->start_touch (ac->session().transport_frame());
                                        ac->set_value (ac->normal(), PBD::Controllable::NoGroup);
                                }
                        }
@@ -614,9 +608,7 @@ 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->automation_state() == Touch && !ac->touching ()) {
-                                               ac->start_touch (ac->session().transport_frame());
-                                       }
+                                       ac->start_touch (ac->session().transport_frame());
                                        ac->set_value (ac->interface_to_internal(v), PBD::Controllable::NoGroup);
                                }
                        }