Optimize automation-event process splitting
[ardour.git] / libs / ardour / ardour / automatable.h
index 8adfb88aaeea999fce649ac31a8d36e9382f9d8d..d2fbb1aa8d574bb6457d51bb24040ed79c6908cd 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <boost/shared_ptr.hpp>
 
+#include "pbd/rcu.h"
 #include "pbd/signals.h"
 
 #include "evoral/ControlSet.hpp"
@@ -50,7 +51,9 @@ public:
        Automatable(Session&);
        Automatable (const Automatable& other);
 
-        virtual ~Automatable();
+       virtual ~Automatable();
+
+       static bool skip_saving_automation; // to be used only by session-state
 
        boost::shared_ptr<Evoral::Control> control_factory(const Evoral::Parameter& id);
 
@@ -83,8 +86,10 @@ public:
        virtual bool find_next_event (double start, double end, Evoral::ControlEvent& ev, bool only_active = true) const;
        void clear_controls ();
 
-        virtual void transport_located (framepos_t now);
-       virtual void transport_stopped (framepos_t now);
+       virtual void non_realtime_locate (samplepos_t now);
+       virtual void non_realtime_transport_stop (samplepos_t now, bool flush);
+
+       virtual void automation_run (samplepos_t, pframes_t, bool only_active = false);
 
        virtual std::string describe_parameter(Evoral::Parameter param);
 
@@ -103,21 +108,26 @@ public:
 
        PBD::Signal0<void> AutomationStateChanged;
 
-  protected:
+protected:
        Session& _a_session;
 
        void can_automate(Evoral::Parameter);
 
-       virtual void automation_list_automation_state_changed (Evoral::Parameter, AutoState) {}
+       virtual void automation_list_automation_state_changed (Evoral::Parameter, AutoState);
+       SerializedRCUManager<ControlList> _automated_controls;
 
        int load_automation (const std::string& path);
        int old_set_automation_state(const XMLNode&);
 
        std::set<Evoral::Parameter> _can_automate_list;
 
-       framepos_t _last_automation_snapshot;
+       samplepos_t _last_automation_snapshot;
+
+       SlavableControlList slavables () const { return SlavableControlList(); }
 
 private:
+       inline void find_next_ac_event (boost::shared_ptr<AutomationControl>, double start, double end, Evoral::ControlEvent& ev) const;
+
        PBD::ScopedConnectionList _control_connections; ///< connections to our controls' signals
 };