Add API to run automation only (emit Changed signal).
[ardour.git] / libs / ardour / automation_list.cc
index ae78a217f7891247c6536856524f038db799d1e7..27bc64462e336debfbff88ed283e38c201a62d3d 100644 (file)
@@ -167,13 +167,14 @@ AutomationList&
 AutomationList::operator= (const AutomationList& other)
 {
        if (this != &other) {
-
+               ControlList::freeze ();
+               /* ControlList::operator= calls copy_events() which calls
+                * mark_dirty() and maybe_signal_changed()
+                */
                ControlList::operator= (other);
                _state = other._state;
                _touching = other._touching;
-
-               mark_dirty ();
-               maybe_signal_changed ();
+               ControlList::thaw ();
        }
 
        return *this;
@@ -211,6 +212,10 @@ AutomationList::default_interpolation () const
                case GainAutomation:
                case BusSendLevel:
                case EnvelopeAutomation:
+#ifndef XXX_NEW_INTERPOLATON__BREAK_SESSION_FORMAT_XXX
+                       /* use old, wrong linear gain interpolation */
+                       return ControlList::Linear;
+#endif
                        return ControlList::Exponential;
                        break;
                case TrimAutomation:
@@ -338,11 +343,25 @@ XMLNode&
 AutomationList::state (bool full)
 {
        XMLNode* root = new XMLNode (X_("AutomationList"));
-       LocaleGuard lg;
 
        root->set_property ("automation-id", EventTypeMap::instance().to_symbol(_parameter));
        root->set_property ("id", id());
+
+#ifndef XXX_NEW_INTERPOLATON__BREAK_SESSION_FORMAT_XXX
+       /* force new enums to existing ones in session-file */
+       Evoral::ControlList::InterpolationStyle is = _interpolation;
+       switch (is) {
+               case ControlList::Exponential:
+               case ControlList::Logarithmic:
+                       is = ControlList::Linear;
+                       break;
+               default:
+                       break;
+       }
+       root->set_property ("interpolation-style", is);
+#else
        root->set_property ("interpolation-style", _interpolation);
+#endif
 
        if (full) {
                /* never serialize state with Write enabled - too dangerous
@@ -426,6 +445,7 @@ AutomationList::deserialize_events (const XMLNode& node)
                        ok = false;
                        break;
                }
+               y = std::min ((double)_desc.upper, std::max ((double)_desc.lower, y));
                fast_simple_add (x, y);
        }
 
@@ -445,7 +465,6 @@ AutomationList::deserialize_events (const XMLNode& node)
 int
 AutomationList::set_state (const XMLNode& node, int version)
 {
-       LocaleGuard lg;
        XMLNodeList nlist = node.children();
        XMLNode* nsos;
        XMLNodeIterator niter;
@@ -484,6 +503,7 @@ AutomationList::set_state (const XMLNode& node, int version)
                                continue;
                        }
 
+                       y = std::min ((double)_desc.upper, std::max ((double)_desc.lower, y));
                        fast_simple_add (x, y);
                }
 
@@ -512,6 +532,12 @@ AutomationList::set_state (const XMLNode& node, int version)
        if (!node.get_property (X_("interpolation-style"), _interpolation)) {
                _interpolation = default_interpolation ();
        }
+#ifndef XXX_NEW_INTERPOLATON__BREAK_SESSION_FORMAT_XXX
+       /* internally force logarithmic and Trim params to use Log-scale */
+       if (_desc.logarithmic || _parameter.type() == TrimAutomation) {
+               _interpolation = ControlList::Logarithmic;
+       }
+#endif
 
        if (node.get_property (X_("state"), _state)) {
                if (_state == Write) {