diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-08-19 21:09:40 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-08-19 21:09:40 +0000 |
commit | 7b6b75f38ff6b34de3f70e36045498f227c1727d (patch) | |
tree | d7bc76a8745daa5051b2bcce7f84910f3ad72aac /libs/ardour/automation_list.cc | |
parent | b6642d14ca64153b5731d1a3a79e4d00060541ca (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.cc | 60 |
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 (); } |