*/
-#include "ardour/ardour.h"
#include <fstream>
-#include <inttypes.h>
#include <cstdio>
#include <errno.h>
#include <glibmm/miscutils.h>
#include "pbd/error.h"
-#include "pbd/enumwriter.h"
-#include "pbd/stacktrace.h"
#include "midi++/names.h"
-#include "ardour/automatable.h"
#include "ardour/amp.h"
+#include "ardour/automatable.h"
#include "ardour/event_type_map.h"
#include "ardour/midi_track.h"
-#include "ardour/pannable.h"
-#include "ardour/panner.h"
#include "ardour/pan_controllable.h"
+#include "ardour/pannable.h"
#include "ardour/plugin_insert.h"
#include "ardour/session.h"
warning << _("Automation node has no path property") << endmsg;
}
- if ((prop = node.property ("visible")) != 0) {
- uint32_t what;
- stringstream sstr;
-
- _visible_controls.clear ();
-
- sstr << prop->value();
- while (1) {
- sstr >> what;
- if (sstr.fail()) {
- break;
- }
- mark_automation_visible (Evoral::Parameter(PluginAutomation, 0, what), true);
- }
- }
-
_last_automation_snapshot = 0;
return 0;
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)
);
automation_list_automation_state_changed (param, al->automation_state ()); // sync everything up
}
-void
-Automatable::what_has_visible_data(set<Evoral::Parameter>& s) const
-{
- Glib::Mutex::Lock lm (control_lock());
- set<Evoral::Parameter>::const_iterator li;
-
- for (li = _visible_controls.begin(); li != _visible_controls.end(); ++li) {
- s.insert (*li);
- }
-}
-
string
Automatable::describe_parameter (Evoral::Parameter param)
{
_can_automate_list.insert (what);
}
-void
-Automatable::mark_automation_visible (Evoral::Parameter what, bool yn)
-{
- if (yn) {
- _visible_controls.insert (what);
- } else {
- set<Evoral::Parameter>::iterator i;
-
- if ((i = _visible_controls.find (what)) != _visible_controls.end()) {
- _visible_controls.erase (i);
- }
- }
-}
-
/** \a legacy_param is used for loading legacy sessions where an object (IO, Panner)
* had a single automation parameter, with it's type implicit. Derived objects should
* pass that type and it will be used for the untyped AutomationList found.
/* Don't clear controls, since some may be special derived Controllable classes */
- _visible_controls.clear ();
-
XMLNodeList nlist = node.children();
XMLNodeIterator niter;
continue;
}
-
-
if (!id_prop) {
warning << "AutomationList node without automation-id property, "
<< "using default: " << EventTypeMap::instance().to_symbol(legacy_param) << endmsg;
}
for (Controls::iterator li = controls().begin(); li != controls().end(); ++li) {
- boost::shared_ptr<AutomationList> l
- = boost::dynamic_pointer_cast<AutomationList>(li->second->list());
+ boost::shared_ptr<AutomationList> l = boost::dynamic_pointer_cast<AutomationList>(li->second->list());
if (!l->empty()) {
node->add_child_nocopy (l->get_state ());
}
Automatable::protect_automation ()
{
typedef set<Evoral::Parameter> ParameterSet;
- ParameterSet automated_params;
+ const ParameterSet& automated_params = what_can_be_automated ();
- what_has_data(automated_params);
-
- for (ParameterSet::iterator i = automated_params.begin(); i != automated_params.end(); ++i) {
+ for (ParameterSet::const_iterator i = automated_params.begin(); i != automated_params.end(); ++i) {
boost::shared_ptr<Evoral::Control> c = control(*i);
boost::shared_ptr<AutomationList> l = boost::dynamic_pointer_cast<AutomationList>(c->list());
if (c) {
boost::shared_ptr<AutomationList> l
= boost::dynamic_pointer_cast<AutomationList>(c->list());
-
+
if (l) {
/* Stop any active touch gesture just before we mark the write pass
as finished. If we don't do this, the transport can end up stopped with
*/
l->stop_touch (true, now);
l->write_pass_finished (now);
-
+
if (l->automation_playback()) {
c->set_value(c->list()->eval(now));
}
-
+
if (l->automation_state() == Write) {
l->set_automation_state (Touch);
}