Some ToDo notes about AutomationTypes
[ardour.git] / libs / ardour / ardour / automation_list.h
index 28f9be3fd4521731d426417a0e024e1050ac5dc8..9810275ed14c15273b63b8f648d07f1b60bd27e8 100644 (file)
@@ -40,6 +40,7 @@
 namespace ARDOUR {
 
 class AutomationList;
+class DoubleBeatsFramesConverter;
 
 /** A SharedStatefulProperty for AutomationLists */
 class LIBARDOUR_API AutomationListProperty : public PBD::SharedStatefulProperty<AutomationList>
@@ -52,38 +53,41 @@ public:
        AutomationListProperty (PBD::PropertyDescriptor<boost::shared_ptr<AutomationList> > d, Ptr o, Ptr c)
                : PBD::SharedStatefulProperty<AutomationList> (d.property_id, o, c)
        {}
-       
+
        PBD::PropertyBase* clone () const;
-       
+
 private:
        /* No copy-construction nor assignment */
        AutomationListProperty (AutomationListProperty const &);
        AutomationListProperty& operator= (AutomationListProperty const &);
 };
 
-class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Evoral::ControlList
+/** AutomationList is a stateful wrapper around Evoral::ControlList.
+ * It includes session-specifics (such as automation state), control logic (e.g. touch, signals)
+ * and acts as proxy to the underlying ControlList which holds the actual data.
+ */
+class LIBARDOUR_API AutomationList : public Evoral::ControlList, public PBD::StatefulDestructible
 {
-  public:
-       AutomationList (Evoral::Parameter id);
+public:
+       AutomationList (const Evoral::Parameter& id, const Evoral::ParameterDescriptor& desc);
+       AutomationList (const Evoral::Parameter& id);
        AutomationList (const XMLNode&, Evoral::Parameter id);
        AutomationList (const AutomationList&);
        AutomationList (const AutomationList&, double start, double end);
        ~AutomationList();
 
-       virtual boost::shared_ptr<Evoral::ControlList> create(Evoral::Parameter id);
+       virtual boost::shared_ptr<ControlList> create(const Evoral::Parameter&           id,
+                                                     const Evoral::ParameterDescriptor& desc);
 
        AutomationList& operator= (const AutomationList&);
 
        void thaw ();
+       bool paste (const ControlList&, double, DoubleBeatsFramesConverter const&);
 
        void set_automation_state (AutoState);
        AutoState automation_state() const { return _state; }
        PBD::Signal1<void, AutoState> automation_state_changed;
 
-       void set_automation_style (AutoStyle m);
-       AutoStyle automation_style() const { return _style; }
-       PBD::Signal0<void> automation_style_changed;
-
        bool automation_playback() const {
                return (_state & Play) || ((_state & Touch) && !touching());
        }
@@ -95,9 +99,12 @@ class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Ev
 
        static PBD::Signal1<void,AutomationList*> AutomationListCreated;
 
+       void start_write_pass (double when);
+       void write_pass_finished (double when, double thinning_factor=0.0);
+
        void start_touch (double when);
        void stop_touch (bool mark, double when);
-        bool touching() const { return g_atomic_int_get (const_cast<gint*>(&_touching)); }
+       bool touching() const { return g_atomic_int_get (const_cast<gint*>(&_touching)); }
        bool writing() const { return _state == Write; }
        bool touch_enabled() const { return _state == Touch; }
 
@@ -106,19 +113,27 @@ class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Ev
        XMLNode& state (bool full);
        XMLNode& serialize_events ();
 
+       Command* memento_command (XMLNode* before, XMLNode* after);
+
        bool operator!= (const AutomationList &) const;
 
-  private:
+       XMLNode* before () { XMLNode* rv = _before; _before = 0; return rv; }
+       void clear_history ();
+
+       ControlList::InterpolationStyle default_interpolation () const;
+
+private:
        void create_curve_if_necessary ();
        int deserialize_events (const XMLNode&);
 
        void maybe_signal_changed ();
 
        AutoState    _state;
-       AutoStyle    _style;
        gint         _touching;
 
        bool operator== (const AutomationList&) const { /* not called */ abort(); return false; }
+       XMLNode* _before; //used for undo of touch start/stop pairs.
+
 };
 
 } // namespace