Implement slaved boolean automation and update mute special-case
[ardour.git] / libs / ardour / ardour / slavable_automation_control.h
index f1a78891e4ec196570e3c7afdd125cb1cf83c6ae..ceafc79193fb950ff4287aac75dbeeb8be31a4c5 100644 (file)
@@ -27,7 +27,7 @@ namespace ARDOUR {
 
 class LIBARDOUR_API SlavableAutomationControl : public AutomationControl
 {
-    public:
+public:
        SlavableAutomationControl(ARDOUR::Session&,
                                  const Evoral::Parameter&                  parameter,
                                  const ParameterDescriptor&                desc,
@@ -36,7 +36,7 @@ class LIBARDOUR_API SlavableAutomationControl : public AutomationControl
                                  PBD::Controllable::Flag                   flags=PBD::Controllable::Flag (0)
                );
 
-       ~SlavableAutomationControl ();
+       virtual ~SlavableAutomationControl ();
 
        double get_value () const;
 
@@ -50,6 +50,14 @@ class LIBARDOUR_API SlavableAutomationControl : public AutomationControl
                return get_masters_value_locked ();
        }
 
+       bool get_masters_curve (framepos_t s, framepos_t e, float* v, framecnt_t l) const {
+               Glib::Threads::RWLock::ReaderLock lm (master_lock);
+               return get_masters_curve_locked (s, e, v, l);
+       }
+       virtual bool get_masters_curve_locked (framepos_t, framepos_t, float*, framecnt_t) const;
+
+       bool masters_curve_multiply (framepos_t, framepos_t, float*, framecnt_t) const;
+
        /* for toggled/boolean controls, returns a count of the number of
           masters currently enabled. For other controls, returns zero.
        */
@@ -64,10 +72,18 @@ class LIBARDOUR_API SlavableAutomationControl : public AutomationControl
        int set_state (XMLNode const&, int);
        XMLNode& get_state();
 
-    protected:
+       bool find_next_event (double n, double e, Evoral::ControlEvent& ev) const
+       {
+               Glib::Threads::RWLock::ReaderLock lm (master_lock);
+               return find_next_event_locked (n, e, ev);
+       }
+
+       bool find_next_event_locked (double now, double end, Evoral::ControlEvent& next_event) const;
+
+protected:
 
        class MasterRecord {
-          public:
+       public:
                MasterRecord (boost::shared_ptr<AutomationControl> gc, double r)
                        : _master (gc)
                        , _yn (false)
@@ -85,7 +101,7 @@ class LIBARDOUR_API SlavableAutomationControl : public AutomationControl
 
                PBD::ScopedConnection connection;
 
-         private:
+  private:
                boost::shared_ptr<AutomationControl> _master;
                /* holds most recently seen master value for boolean/toggle controls */
                bool   _yn;
@@ -94,13 +110,17 @@ class LIBARDOUR_API SlavableAutomationControl : public AutomationControl
        mutable Glib::Threads::RWLock master_lock;
        typedef std::map<PBD::ID,MasterRecord> Masters;
        Masters _masters;
-       PBD::ScopedConnectionList masters_connections;
+       std::map<boost::weak_ptr<AutomationControl>, PBD::ScopedConnection> masters_connections;
 
        void   master_going_away (boost::weak_ptr<AutomationControl>);
        double get_value_locked() const;
        void   actually_set_value (double value, PBD::Controllable::GroupControlDisposition);
        void   update_boolean_masters_records (boost::shared_ptr<AutomationControl>);
 
+       virtual bool handle_master_change (boost::shared_ptr<AutomationControl>);
+       virtual bool boolean_automation_run_locked (framepos_t start, pframes_t len);
+       bool boolean_automation_run (framepos_t start, pframes_t len);
+
        virtual void   master_changed (bool from_self, GroupControlDisposition gcd, boost::shared_ptr<AutomationControl>);
        virtual double get_masters_value_locked () const;
        virtual void   pre_remove_master (boost::shared_ptr<AutomationControl>) {}