#include "ardour/event_type_map.h"
#include "ardour/parameter_descriptor.h"
#include "evoral/Curve.hpp"
+#include "pbd/memento_command.h"
#include "pbd/stacktrace.h"
#include "pbd/enumwriter.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
#endif
AutomationList::AutomationList (const Evoral::Parameter& id, const Evoral::ParameterDescriptor& desc)
: ControlList(id, desc)
+ , _before (0)
{
_state = Off;
_style = Absolute;
AutomationList::AutomationList (const Evoral::Parameter& id)
: ControlList(id, ARDOUR::ParameterDescriptor(id))
+ , _before (0)
{
_state = Off;
_style = Absolute;
AutomationList::AutomationList (const AutomationList& other)
: StatefulDestructible()
, ControlList(other)
+ , _before (0)
{
_style = other._style;
_state = other._state;
AutomationList::AutomationList (const AutomationList& other, double start, double end)
: ControlList(other, start, end)
+ , _before (0)
{
_style = other._style;
_state = other._state;
*/
AutomationList::AutomationList (const XMLNode& node, Evoral::Parameter id)
: ControlList(id, ARDOUR::ParameterDescriptor(id))
+ , _before (0)
{
g_atomic_int_set (&_touching, 0);
_state = Off;
AutomationList::~AutomationList()
{
+ delete _before;
}
boost::shared_ptr<Evoral::ControlList>
{
switch (_parameter.type()) {
case GainAutomation:
+ case TrimAutomation:
case PanAzimuthAutomation:
case PanElevationAutomation:
case PanWidthAutomation:
{
if (s != _state) {
_state = s;
+ delete _before;
+ if (s == Write && _desc.toggled) {
+ _before = &get_state ();
+ } else {
+ _before = 0;
+ }
automation_state_changed (s); /* EMIT SIGNAL */
}
}
}
}
+void
+AutomationList::start_write_pass (double when)
+{
+ delete _before;
+ if (in_new_write_pass ()) {
+ _before = &get_state ();
+ } else {
+ _before = 0;
+ }
+ ControlList::start_write_pass (when);
+}
+
+void
+AutomationList::write_pass_finished (double when, double thinning_factor)
+{
+ ControlList::write_pass_finished (when, thinning_factor);
+}
+
void
AutomationList::start_touch (double when)
{
if (_state == Touch) {
if (mark) {
-
+
/* XXX need to mark the last added point with the
- * current time
+ * current time
*/
}
}
}
+/* _before may be owned by the undo stack,
+ * so we have to be careful about doing this.
+ *
+ * ::before () transfers ownership, setting _before to 0
+ */
+void
+AutomationList::clear_history ()
+{
+ delete _before;
+ _before = 0;
+}
+
void
AutomationList::thaw ()
{
}
}
+Command*
+AutomationList::memento_command (XMLNode* before, XMLNode* after)
+{
+ return new MementoCommand<AutomationList> (*this, before, after);
+}
+
XMLNode&
AutomationList::get_state ()
{
{
XMLNode* root = new XMLNode (X_("AutomationList"));
char buf[64];
- LocaleGuard lg (X_("POSIX"));
+ LocaleGuard lg;
root->add_property ("automation-id", EventTypeMap::instance().to_symbol(_parameter));
if (_state != Write) {
root->add_property ("state", auto_state_to_string (_state));
} else {
- root->add_property ("state", auto_state_to_string (Off));
+ if (_events.empty ()) {
+ root->add_property ("state", auto_state_to_string (Off));
+ } else {
+ root->add_property ("state", auto_state_to_string (Touch));
+ }
}
} else {
/* never save anything but Off for automation state to a template */
int
AutomationList::set_state (const XMLNode& node, int version)
{
- LocaleGuard lg (X_("POSIX"));
+ LocaleGuard lg;
XMLNodeList nlist = node.children();
XMLNode* nsos;
XMLNodeIterator niter;
- const XMLProperty* prop;
+ XMLProperty const * prop;
if (node.name() == X_("events")) {
/* partial state setting*/
const XMLNodeList& elist = node.children();
XMLNodeConstIterator i;
- XMLProperty* prop;
+ XMLProperty const * prop;
pframes_t x;
double y;
boost::shared_ptr<AutomationList> (new AutomationList (*this->_current.get()))
);
}
-
+