forward port 2.X changes up to and including rev 6909
[ardour.git] / libs / ardour / automatable.cc
index be3701fc9399e903ff14bac547f65b0fb3e1daf6..5ae4e96b4e1f87436e53a0356ba9ed350e6d22b6 100644 (file)
@@ -22,6 +22,9 @@
 #include <inttypes.h>
 #include <cstdio>
 #include <errno.h>
+
+#include <glibmm/miscutils.h>
+
 #include "pbd/error.h"
 #include "pbd/enumwriter.h"
 
@@ -98,7 +101,7 @@ Automatable::load_automation (const string& path)
 {
        string fullpath;
 
-       if (path[0] == '/') { // legacy
+       if (Glib::path_is_absolute (path)) { // legacy
                fullpath = path;
        } else {
                fullpath = _a_session.automation_dir();
@@ -147,19 +150,17 @@ Automatable::add_control(boost::shared_ptr<Evoral::Control> ac)
 {
        Evoral::Parameter param = ac->parameter();
 
-       ControlSet::add_control(ac);
-       _can_automate_list.insert(param);
-       auto_state_changed(param); // sync everything up
+       boost::shared_ptr<AutomationList> al = boost::dynamic_pointer_cast<AutomationList> (ac->list ());
+       assert (al);
+       
+       al->automation_state_changed.connect_same_thread (
+               _list_connections, boost::bind (&Automatable::automation_list_automation_state_changed, this, ac->parameter(), _1)
+               );
 
-       /* connect to automation_state_changed so that we can emit a signal when one of our controls'
-          automation state changes
-       */
-       boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl> (ac);
-       if (c) {
-               c->alist()->automation_state_changed.connect_same_thread (
-                       _control_connections, boost::bind (&Automatable::automation_state_changed, this, c->parameter())
-                       );
-       }
+       ControlSet::add_control (ac);
+       _can_automate_list.insert (param);
+
+       automation_list_automation_state_changed (param, al->automation_state ()); // sync everything up
 }
 
 void
@@ -315,21 +316,16 @@ Automatable::set_parameter_automation_state (Evoral::Parameter param, AutoState
 }
 
 AutoState
-Automatable::get_parameter_automation_state (Evoral::Parameter param, bool lock)
+Automatable::get_parameter_automation_state (Evoral::Parameter param)
 {
        AutoState result = Off;
 
-       if (lock)
-               control_lock().lock();
-
        boost::shared_ptr<Evoral::Control> c = control(param);
        boost::shared_ptr<AutomationList> l = boost::dynamic_pointer_cast<AutomationList>(c->list());
 
-       if (c)
+       if (c) {
                result = l->automation_state();
-
-       if (lock)
-               control_lock().unlock();
+       }
 
        return result;
 }
@@ -398,7 +394,7 @@ Automatable::automation_snapshot (nframes_t now, bool force)
                        boost::shared_ptr<AutomationControl> c
                                        = boost::dynamic_pointer_cast<AutomationControl>(i->second);
                        if (c->automation_write()) {
-                               c->list()->rt_add (now, i->second->user_float());
+                               c->list()->rt_add (now, i->second->user_double());
                        }
                }
 
@@ -479,16 +475,9 @@ Automatable::automation_control (const Evoral::Parameter& id) const
        return boost::dynamic_pointer_cast<const AutomationControl>(Evoral::ControlSet::control(id));
 }
 
-void
-Automatable::automation_state_changed (Evoral::Parameter const & p)
-{
-       AutomationStateChanged (p); /* EMIT SIGNAL */
-}
-
 void
 Automatable::clear_controls ()
 {
        _control_connections.drop_connections ();
        ControlSet::clear_controls ();
 }
-