Optimize automation-event process splitting
[ardour.git] / libs / ardour / ardour / automatable.h
index 736992d3d06d776794ced80f9da0ad3574e0ebbc..d2fbb1aa8d574bb6457d51bb24040ed79c6908cd 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <boost/shared_ptr.hpp>
 
+#include "pbd/rcu.h"
 #include "pbd/signals.h"
 
 #include "evoral/ControlSet.hpp"
@@ -52,6 +53,8 @@ public:
 
        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);
 
        boost::shared_ptr<AutomationControl> automation_control (PBD::ID const & id) const;
@@ -83,10 +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 non_realtime_locate (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 (framepos_t, pframes_t);
+       virtual void automation_run (samplepos_t, pframes_t, bool only_active = false);
 
        virtual std::string describe_parameter(Evoral::Parameter param);
 
@@ -110,18 +113,21 @@ protected:
 
        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
 };