fix to follow changes to evoral/libardour split
[ardour.git] / libs / ardour / automation_list.cc
index 54d838f6e286c87b72d3cf4e632f2ab4cb6e43f6..cf41c4183943c0dee50952c7cd1c0d89a5c900f3 100644 (file)
@@ -25,6 +25,7 @@
 #include <algorithm>
 #include "ardour/automation_list.h"
 #include "ardour/event_type_map.h"
+#include "ardour/parameter_descriptor.h"
 #include "evoral/Curve.hpp"
 #include "pbd/stacktrace.h"
 #include "pbd/enumwriter.h"
@@ -47,8 +48,21 @@ static void dumpit (const AutomationList& al, string prefix = "")
        cerr << "\n";
 }
 #endif
-AutomationList::AutomationList (Evoral::Parameter id)
-       : ControlList(id)
+AutomationList::AutomationList (const Evoral::Parameter& id, const Evoral::ParameterDescriptor& desc)
+       : ControlList(id, desc)
+{
+       _state = Off;
+       _style = Absolute;
+       g_atomic_int_set (&_touching, 0);
+
+       create_curve_if_necessary();
+
+       assert(_parameter.type() != NullAutomation);
+       AutomationListCreated(this);
+}
+
+AutomationList::AutomationList (const Evoral::Parameter& id)
+       : ControlList(id, ARDOUR::ParameterDescriptor(id))
 {
        _state = Off;
        _style = Absolute;
@@ -91,7 +105,7 @@ AutomationList::AutomationList (const AutomationList& other, double start, doubl
  * in or below the AutomationList node.  It is used if @param id is non-null.
  */
 AutomationList::AutomationList (const XMLNode& node, Evoral::Parameter id)
-       : ControlList(id)
+       : ControlList(id, ARDOUR::ParameterDescriptor(id))
 {
        g_atomic_int_set (&_touching, 0);
        _state = Off;
@@ -114,9 +128,10 @@ AutomationList::~AutomationList()
 }
 
 boost::shared_ptr<Evoral::ControlList>
-AutomationList::create(Evoral::Parameter id)
+AutomationList::create(const Evoral::Parameter&           id,
+                       const Evoral::ParameterDescriptor& desc)
 {
-       return boost::shared_ptr<Evoral::ControlList>(new AutomationList(id));
+       return boost::shared_ptr<Evoral::ControlList>(new AutomationList(id, desc));
 }
 
 void
@@ -137,26 +152,16 @@ AutomationList::create_curve_if_necessary()
        }
 }
 
-bool
-AutomationList::operator== (const AutomationList& other)
-{
-       return _events == other._events;
-}
-
 AutomationList&
 AutomationList::operator= (const AutomationList& other)
 {
        if (this != &other) {
 
-               _events.clear ();
-
-               for (const_iterator i = other._events.begin(); i != other._events.end(); ++i) {
-                       _events.push_back (new Evoral::ControlEvent (**i));
-               }
 
-               _min_yval = other._min_yval;
-               _max_yval = other._max_yval;
-               _default_value = other._default_value;
+               ControlList::operator= (other);
+               _state = other._state;
+               _style = other._style;
+               _touching = other._touching;
 
                mark_dirty ();
                maybe_signal_changed ();
@@ -180,11 +185,6 @@ AutomationList::set_automation_state (AutoState s)
 {
        if (s != _state) {
                _state = s;
-
-                if (_state == Write) {
-                        Glib::Mutex::Lock lm (ControlList::_lock);
-                        nascent.push_back (new NascentInfo ());
-                }
                automation_state_changed (s); /* EMIT SIGNAL */
        }
 }
@@ -202,15 +202,14 @@ void
 AutomationList::start_touch (double when)
 {
         if (_state == Touch) {
-                Glib::Mutex::Lock lm (ControlList::_lock);
-                nascent.push_back (new NascentInfo (when));
+               start_write_pass (when);
         }
 
        g_atomic_int_set (&_touching, 1);
 }
 
 void
-AutomationList::stop_touch (bool mark, double when)
+AutomationList::stop_touch (bool mark, double)
 {
        if (g_atomic_int_get (&_touching) == 0) {
                /* this touch has already been stopped (probably by Automatable::transport_stopped),
@@ -223,22 +222,11 @@ AutomationList::stop_touch (bool mark, double when)
 
         if (_state == Touch) {
 
-               assert (!nascent.empty ());
-
-                Glib::Mutex::Lock lm (ControlList::_lock);
-
                 if (mark) {
-
-                       nascent.back()->end_time = when;
-
-                } else {
-
-                        /* nascent info created in start touch but never used. just get rid of it.
-                         */
-
-                        NascentInfo* ninfo = nascent.back ();
-                        nascent.erase (nascent.begin());
-                        delete ninfo;
+                       
+                       /* XXX need to mark the last added point with the
+                        * current time 
+                        */
                 }
         }
 }
@@ -363,8 +351,6 @@ AutomationList::deserialize_events (const XMLNode& node)
                fast_simple_add (x, y);
        }
 
-       thin ();
-
        if (!ok) {
                clear ();
                error << _("automation list: cannot load coordinates from XML, all points ignored") << endmsg;
@@ -427,9 +413,7 @@ AutomationList::set_state (const XMLNode& node, int version)
                        fast_simple_add (x, y);
                }
 
-               thin ();
-
-                thaw ();
+               thaw ();
 
                return 0;
        }
@@ -445,9 +429,9 @@ AutomationList::set_state (const XMLNode& node, int version)
        }
 
        if ((prop = node.property (X_("automation-id"))) != 0){
-               _parameter = EventTypeMap::instance().new_parameter(prop->value());
+               _parameter = EventTypeMap::instance().from_symbol(prop->value());
        } else {
-               warning << "Legacy session: automation list has no automation-id property.";
+               warning << "Legacy session: automation list has no automation-id property." << endmsg;
        }
 
        if ((prop = node.property (X_("interpolation-style"))) != 0) {
@@ -473,6 +457,7 @@ AutomationList::set_state (const XMLNode& node, int version)
                 if (_state == Write) {
                         _state = Off;
                 }
+               automation_state_changed(_state);
        } else {
                _state = Off;
        }
@@ -510,3 +495,24 @@ AutomationList::set_state (const XMLNode& node, int version)
        return 0;
 }
 
+bool
+AutomationList::operator!= (AutomationList const & other) const
+{
+       return (
+               static_cast<ControlList const &> (*this) != static_cast<ControlList const &> (other) ||
+               _state != other._state ||
+               _style != other._style ||
+               _touching != other._touching
+               );
+}
+
+PBD::PropertyBase *
+AutomationListProperty::clone () const
+{
+       return new AutomationListProperty (
+               this->property_id(),
+               boost::shared_ptr<AutomationList> (new AutomationList (*this->_old.get())),
+               boost::shared_ptr<AutomationList> (new AutomationList (*this->_current.get()))
+               );
+}
+