consolidate semaphore implementation (part one)
[ardour.git] / libs / ardour / ardour / automation_list.h
index 6e7b0007cd6fe78de4033e76c73a201c2b8fe75b..37a30acd0305c28b9600a17525447441e6b4cd2e 100644 (file)
 #define __ardour_automation_event_h__
 
 #include <stdint.h>
+#include <cstdlib>
 #include <list>
 #include <cmath>
 
 #include <glibmm/threads.h>
 
+#include "evoral/ControlList.hpp"
+#include "evoral/Parameter.hpp"
+
 #include "pbd/undo.h"
 #include "pbd/xml++.h"
 #include "pbd/statefuldestructible.h"
@@ -33,8 +37,6 @@
 
 #include "ardour/ardour.h"
 
-#include "evoral/ControlList.hpp"
-
 namespace ARDOUR {
 
 class AutomationList;
@@ -50,9 +52,9 @@ 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 &);
@@ -62,16 +64,17 @@ private:
 class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Evoral::ControlList
 {
   public:
-       AutomationList (Evoral::Parameter id);
+       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&);
-       bool operator== (const AutomationList&);
 
        void thaw ();
 
@@ -94,6 +97,9 @@ 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)); }
@@ -107,6 +113,8 @@ class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Ev
 
        bool operator!= (const AutomationList &) const;
 
+       XMLNode* before () { return _before; }
+       void clear_history ();
   private:
        void create_curve_if_necessary ();
        int deserialize_events (const XMLNode&);
@@ -116,6 +124,10 @@ class LIBARDOUR_API AutomationList : public PBD::StatefulDestructible, public Ev
        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