Use XMLNode::get/set_property API in Tempo/Time related classes
[ardour.git] / libs / ardour / ardour / solo_control.h
index 78ce7c56be5c25c72c568177f0559c0573d5fd75..cc8698358262835600d0a036b951f57e446187c2 100644 (file)
@@ -38,6 +38,9 @@ class LIBARDOUR_API SoloControl : public SlavableAutomationControl
        SoloControl (Session& session, std::string const & name, Soloable& soloable, Muteable& m);
 
        double get_value () const;
+       double get_save_value() const { return self_soloed(); }
+
+       bool can_solo() const;
 
        /* Export additional API so that objects that only get access
         * to a Controllable/AutomationControl can do more fine-grained
@@ -60,8 +63,17 @@ class LIBARDOUR_API SoloControl : public SlavableAutomationControl
        /* API to check different aspects of solo substate
         */
 
+       bool self_soloed () const {
+               return _self_solo;
+       }
+       bool soloed_by_masters () const {
+               return get_masters_value();
+       }
+       bool soloed_by_self_or_masters () const {
+               return self_soloed() || get_masters_value ();
+       }
        bool soloed_by_others () const {
-               return _soloed_by_others_downstream || _soloed_by_others_downstream || get_masters_value ();
+               return _soloed_by_others_downstream || _soloed_by_others_upstream || get_masters_value ();
        }
        uint32_t soloed_by_others_upstream () const {
                return _soloed_by_others_upstream;
@@ -69,11 +81,16 @@ class LIBARDOUR_API SoloControl : public SlavableAutomationControl
        uint32_t soloed_by_others_downstream () const {
                return _soloed_by_others_downstream;
        }
-       bool self_soloed () const {
-               return _self_solo;
-       }
        bool soloed() const { return self_soloed() || soloed_by_others(); }
 
+       /* The session object needs to respond to solo
+          changes, but to do so accurately it needs to know if we transition
+          into or out of solo. The normal Changed signal doesn't make that
+          possible.
+       */
+
+       int32_t transitioned_into_solo () const { return _transition_into_solo; }
+
        void clear_all_solo_state ();
 
        int set_state (XMLNode const&, int);
@@ -86,11 +103,12 @@ class LIBARDOUR_API SoloControl : public SlavableAutomationControl
        void post_add_master (boost::shared_ptr<AutomationControl>);
 
   private:
-       Soloable&      _soloable;
-       Muteable&      _muteable;
-       bool           _self_solo;
-       uint32_t       _soloed_by_others_upstream;
-       uint32_t       _soloed_by_others_downstream;
+       Soloable& _soloable;
+       Muteable& _muteable;
+       bool      _self_solo;
+       uint32_t  _soloed_by_others_upstream;
+       uint32_t  _soloed_by_others_downstream;
+       int32_t   _transition_into_solo;
 
        void set_self_solo (bool yn);
        void set_mute_master_solo ();