summaryrefslogtreecommitdiff
path: root/libs/ardour/automation_list.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-08-19 21:09:40 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-08-19 21:09:40 +0000
commit7b6b75f38ff6b34de3f70e36045498f227c1727d (patch)
treed7bc76a8745daa5051b2bcce7f84910f3ad72aac /libs/ardour/automation_list.cc
parentb6642d14ca64153b5731d1a3a79e4d00060541ca (diff)
forward port automation handling changes from 2.x, upto and including about rev 6981 (will need full testing in the 3.X context). as on 2.x, this removes real-time visual updates to automation curves during write/touch automation recording
git-svn-id: svn://localhost/ardour2/branches/3.0@7653 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/automation_list.cc')
-rw-r--r--libs/ardour/automation_list.cc60
1 files changed, 47 insertions, 13 deletions
diff --git a/libs/ardour/automation_list.cc b/libs/ardour/automation_list.cc
index 2270b2eff7..53fdb233c6 100644
--- a/libs/ardour/automation_list.cc
+++ b/libs/ardour/automation_list.cc
@@ -53,7 +53,7 @@ AutomationList::AutomationList (Evoral::Parameter id)
{
_state = Off;
_style = Absolute;
- _touching = false;
+ g_atomic_int_set (&_touching, 0);
create_curve_if_necessary();
@@ -67,7 +67,7 @@ AutomationList::AutomationList (const AutomationList& other)
{
_style = other._style;
_state = other._state;
- _touching = other._touching;
+ g_atomic_int_set (&_touching, other.touching());
create_curve_if_necessary();
@@ -80,7 +80,7 @@ AutomationList::AutomationList (const AutomationList& other, double start, doubl
{
_style = other._style;
_state = other._state;
- _touching = other._touching;
+ g_atomic_int_set (&_touching, other.touching());
create_curve_if_necessary();
@@ -94,7 +94,7 @@ AutomationList::AutomationList (const AutomationList& other, double start, doubl
AutomationList::AutomationList (const XMLNode& node, Evoral::Parameter id)
: ControlList(id)
{
- _touching = false;
+ g_atomic_int_set (&_touching, 0);
_state = Off;
_style = Absolute;
@@ -180,6 +180,12 @@ AutomationList::set_automation_state (AutoState s)
{
if (s != _state) {
_state = s;
+
+ if (_state == Write) {
+ Glib::Mutex::Lock lm (ControlList::_lock);
+ nascent.push_back (new NascentInfo (false));
+ }
+
automation_state_changed (s); /* EMIT SIGNAL */
}
}
@@ -194,17 +200,37 @@ AutomationList::set_automation_style (AutoStyle s)
}
void
-AutomationList::start_touch ()
+AutomationList::start_touch (double when)
{
- _touching = true;
- _new_value = true;
+ if (_state == Touch) {
+ Glib::Mutex::Lock lm (ControlList::_lock);
+ nascent.push_back (new NascentInfo (true, when));
+ }
+
+ g_atomic_int_set (&_touching, 1);
}
void
-AutomationList::stop_touch ()
+AutomationList::stop_touch (bool mark, double when)
{
- _touching = false;
- _new_value = false;
+ g_atomic_int_set (&_touching, 0);
+
+ if (_state == Touch) {
+ Glib::Mutex::Lock lm (ControlList::_lock);
+
+ if (mark) {
+ nascent.back()->end_time = when;
+
+ } else {
+
+ /* nascent info created in start touch but never used. just get rid of it.
+ */
+
+ NascentInfo* ninfo = nascent.back ();
+ nascent.erase (nascent.begin());
+ delete ninfo;
+ }
+ }
}
void
@@ -247,7 +273,14 @@ AutomationList::state (bool full)
root->add_property ("interpolation-style", enum_2_string (_interpolation));
if (full) {
- root->add_property ("state", auto_state_to_string (_state));
+ /* never serialize state with Write enabled - too dangerous
+ for the user's data
+ */
+ if (_state != Write) {
+ root->add_property ("state", auto_state_to_string (_state));
+ } else {
+ root->add_property ("state", auto_state_to_string (Off));
+ }
} else {
/* never save anything but Off for automation state to a template */
root->add_property ("state", auto_state_to_string (Off));
@@ -327,7 +360,6 @@ AutomationList::deserialize_events (const XMLNode& node)
error << _("automation list: cannot load coordinates from XML, all points ignored") << endmsg;
} else {
mark_dirty ();
- reposition_for_rt_add (0);
maybe_signal_changed ();
}
@@ -426,6 +458,9 @@ AutomationList::set_state (const XMLNode& node, int version)
if ((prop = node.property (X_("state"))) != 0) {
_state = string_to_auto_state (prop->value());
+ if (_state == Write) {
+ _state = Off;
+ }
} else {
_state = Off;
}
@@ -462,7 +497,6 @@ AutomationList::set_state (const XMLNode& node, int version)
freeze ();
clear ();
mark_dirty ();
- reposition_for_rt_add (0);
maybe_signal_changed ();
thaw ();
}