Pan automation/serialization fixes.
[ardour.git] / libs / ardour / automatable.cc
index d7c570ecdf46b1d30a3430448a9462ee2e591550..ab45edee0312aec8edc7b8664b2c17e29b219cf3 100644 (file)
@@ -127,8 +127,6 @@ Automatable::add_control(boost::shared_ptr<AutomationControl> ac)
        
        cerr << _name << ": added parameter " << param.to_string() << endl;
 
-       // FIXME: sane default behaviour?
-       _visible_controls.insert(param);
        _can_automate_list.insert(param);
 
        // Sync everything (derived classes) up to initial values
@@ -169,11 +167,11 @@ Automatable::control (ParamID parameter, bool create_if_missing)
                return i->second;
 
        } else if (create_if_missing) {
-               assert(parameter.type() != GainAutomation);
                boost::shared_ptr<AutomationList> al (new AutomationList (
                                        parameter, FLT_MIN, FLT_MAX, default_parameter_value (parameter)));
                boost::shared_ptr<AutomationControl> ac (new AutomationControl(_session, al));
                add_control(ac);
+               cerr << "WARNING: Default AutomationControl created for " << parameter.to_string() << endl;
                return ac;
 
        } else {
@@ -203,8 +201,8 @@ Automatable::describe_parameter (ParamID param)
 
        if (param == ParamID(GainAutomation))
                return _("Fader");
-       else if (param == ParamID(PanAutomation))
-               return _("Pan");
+       else if (param.type() == PanAutomation)
+               return (string_compose(_("Pan %1"), param.id()));
        else if (param.type() == MidiCCAutomation)
                return string_compose("CC %1", param.id());
        else
@@ -355,17 +353,22 @@ Automatable::set_parameter_automation_state (ParamID param, AutoState s)
 }
 
 AutoState
-Automatable::get_parameter_automation_state (ParamID param)
+Automatable::get_parameter_automation_state (ParamID param, bool lock)
 {
-       Glib::Mutex::Lock lm (_automation_lock);
+       AutoState result = Off;
+
+       if (lock)
+               _automation_lock.lock();
 
        boost::shared_ptr<AutomationControl> c = control(param);
 
-       if (c) {
-               return c->list()->automation_state();
-       } else {
-               return Off;
-       }
+       if (c)
+               result = c->list()->automation_state();
+       
+       if (lock)
+               _automation_lock.unlock();
+
+       return result;
 }
 
 void
@@ -434,3 +437,18 @@ Automatable::automation_snapshot (nframes_t now)
        }
 }
 
+void
+Automatable::transport_stopped (nframes_t now)
+{
+       for (Controls::iterator li = _controls.begin(); li != _controls.end(); ++li) {
+               
+               boost::shared_ptr<AutomationControl> c = li->second;
+               
+               c->list()->reposition_for_rt_add (now);
+
+               if (c->list()->automation_state() != Off) {
+                       c->set_value(c->list()->eval(now));
+               }
+       }
+}
+