X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fautomation_control.cc;h=5755e04aacc7e04210acebd7c52eb8ad6ee93b4f;hb=ad226cf2bbd72dd0dc033d8f0cf44c635b90e0b4;hp=9b7628a7ad7e2b98571de1c382bba40026b6f443;hpb=bde3edf1c8f5075af5913eaea4dc81b199a17138;p=ardour.git diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc index 9b7628a7ad..5755e04aac 100644 --- a/libs/ardour/automation_control.cc +++ b/libs/ardour/automation_control.cc @@ -56,8 +56,9 @@ AutomationControl::AutomationControl(ARDOUR::Session& s : Controllable (name.empty() ? EventTypeMap::instance().to_symbol(parameter) : name, flags) , Evoral::Control(parameter, desc, list) - , _session(session) + , SessionHandleRef (session) , _desc(desc) + , _no_session(false) { if (_desc.toggled) { set_flags (Controllable::Toggle); @@ -70,8 +71,18 @@ AutomationControl::AutomationControl(ARDOUR::Session& s AutomationControl::~AutomationControl () { - _session.selection().remove_control_by_id (id()); + if (!_no_session && !_session.deletion_in_progress ()) { + _session.selection().remove_control_by_id (id()); + DropReferences (); /* EMIT SIGNAL */ + } +} + +void +AutomationControl::session_going_away () +{ + SessionHandleRef::session_going_away (); DropReferences (); /* EMIT SIGNAL */ + _no_session = true; } bool @@ -88,8 +99,8 @@ AutomationControl::writable() const double AutomationControl::get_value() const { - bool from_list = _list && boost::dynamic_pointer_cast(_list)->automation_playback(); - return Control::get_double (from_list, _session.transport_frame()); + bool from_list = alist() && alist()->automation_playback(); + return Control::get_double (from_list, _session.transport_sample()); } double @@ -147,7 +158,7 @@ AutomationControl::grouped_controls () const } void -AutomationControl::automation_run (framepos_t start, pframes_t nframes) +AutomationControl::automation_run (samplepos_t start, pframes_t nframes) { if (!automation_playback ()) { return; @@ -174,8 +185,8 @@ AutomationControl::automation_run (framepos_t start, pframes_t nframes) void AutomationControl::actually_set_value (double value, PBD::Controllable::GroupControlDisposition gcd) { - boost::shared_ptr al = boost::dynamic_pointer_cast (_list); - const framepos_t pos = _session.transport_frame(); + boost::shared_ptr al = alist (); + const samplepos_t pos = _session.transport_sample(); bool to_list; /* We cannot use ::get_value() here since that is virtual, and intended @@ -230,7 +241,7 @@ AutomationControl::set_automation_state (AutoState as) if (flags() & NotAutomatable) { return; } - if (_list && as != alist()->automation_state()) { + if (alist() && as != alist()->automation_state()) { const double val = get_value (); @@ -242,10 +253,10 @@ AutomationControl::set_automation_state (AutoState as) if (as == Write) { AutomationWatch::instance().add_automation_watch (shared_from_this()); - } else if (as == Touch) { + } else if (as & (Touch | Latch)) { if (alist()->empty()) { - Control::set_double (val, _session.current_start_frame (), true); - Control::set_double (val, _session.current_end_frame (), true); + Control::set_double (val, _session.current_start_sample (), true); + Control::set_double (val, _session.current_end_sample (), true); Changed (true, Controllable::NoGroup); } if (!touching()) { @@ -272,7 +283,7 @@ AutomationControl::start_touch (double when) return; } - if (alist()->automation_state() == Touch) { + if (alist()->automation_state() & (Touch | Latch)) { /* subtle. aligns the user value with the playback and * use take actual value (incl masters). * @@ -295,9 +306,13 @@ AutomationControl::stop_touch (double when) return; } + if (alist()->automation_state() == Latch && _session.transport_rolling ()) { + return; + } + set_touching (false); - if (alist()->automation_state() == Touch) { + if (alist()->automation_state() & (Touch | Latch)) { alist()->stop_touch (when); if (!_desc.toggled) { AutomationWatch::instance().remove_automation_watch (shared_from_this());