Experimental patch to ensure playback buffer bounds use minimal beat->frame rounding.
[ardour.git] / libs / ardour / ardour / solo_control.h
index 78ce7c56be5c25c72c568177f0559c0573d5fd75..89aa16d02277bc017d42ccf7e38f9c7565141d0e 100644 (file)
@@ -39,6 +39,8 @@ class LIBARDOUR_API SoloControl : public SlavableAutomationControl
 
        double get_value () const;
 
+       bool can_solo() const;
+
        /* Export additional API so that objects that only get access
         * to a Controllable/AutomationControl can do more fine-grained
         * operations with respect to solo. Obviously, they would need
@@ -60,6 +62,15 @@ 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 ();
        }
@@ -69,11 +80,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 +102,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 ();