diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-07-17 03:10:40 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-07-17 03:10:40 +0000 |
commit | 3c252e9321dccf9b653b6b9ab4a7ffe5cda31b79 (patch) | |
tree | b8afdbe754818713249fb9d14e5b8a79ab24243d /libs/ardour/automation_watch.cc | |
parent | 539b94490f7ab660f24b3de80df5514f61d481b0 (diff) |
lots more fidgety work on automation. sort of works now, but undo/redo needs attention
git-svn-id: svn://localhost/ardour2/branches/3.0@13047 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/automation_watch.cc')
-rw-r--r-- | libs/ardour/automation_watch.cc | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/libs/ardour/automation_watch.cc b/libs/ardour/automation_watch.cc index 670636e977..5fefcaca8d 100644 --- a/libs/ardour/automation_watch.cc +++ b/libs/ardour/automation_watch.cc @@ -68,6 +68,16 @@ AutomationWatch::add_automation_watch (boost::shared_ptr<AutomationControl> ac) DEBUG_TRACE (DEBUG::Automation, string_compose ("now watching control %1 for automation\n", ac->name())); automation_watches.push_back (ac); + /* if an automation control is added here while the transport is + * rolling, make sure that it knows that there is a write pass going + * on, rather than waiting for the transport to start. + */ + + if (_session && _session->transport_rolling() && ac->alist()->automation_write()) { + DEBUG_TRACE (DEBUG::Automation, string_compose ("\ttransport is rolling @ %1, so enter write pass\n", _session->transport_speed())); + ac->list()->set_in_write_pass (true); + } + /* we can't store shared_ptr<Destructible> in connections because it * creates reference cycles. we don't need to make the weak_ptr<> * explicit here, but it helps to remind us what is going on. @@ -95,6 +105,7 @@ AutomationWatch::remove_automation_watch (boost::shared_ptr<AutomationControl> a Glib::Mutex::Lock lm (automation_watch_lock); DEBUG_TRACE (DEBUG::Automation, string_compose ("remove control %1 from automation watch\n", ac->name())); automation_watches.remove (ac); + ac->list()->set_in_write_pass (false); } gint @@ -110,7 +121,9 @@ AutomationWatch::timer () framepos_t time = _session->audible_frame (); for (AutomationWatches::iterator aw = automation_watches.begin(); aw != automation_watches.end(); ++aw) { - (*aw)->list()->add (time, (*aw)->user_double(), true); + if ((*aw)->alist()->automation_write()) { + (*aw)->list()->add (time, (*aw)->user_double()); + } } } @@ -129,6 +142,8 @@ AutomationWatch::thread () void AutomationWatch::set_session (Session* s) { + transport_connection.disconnect (); + if (_thread) { _run_thread = false; _thread->join (); @@ -142,5 +157,31 @@ AutomationWatch::set_session (Session* s) _thread = Glib::Thread::create (boost::bind (&AutomationWatch::thread, this), 500000, true, true, Glib::THREAD_PRIORITY_NORMAL); + _session->TransportStateChange.connect_same_thread (transport_connection, boost::bind (&AutomationWatch::transport_state_change, this)); + } +} + +void +AutomationWatch::transport_state_change () +{ + if (!_session) { + return; + } + + bool rolling = _session->transport_rolling(); + + { + Glib::Mutex::Lock lm (automation_watch_lock); + + for (AutomationWatches::iterator aw = automation_watches.begin(); aw != automation_watches.end(); ++aw) { + DEBUG_TRACE (DEBUG::Automation, string_compose ("%1: transport state changed, speed %2, in write pass ? %3 writing ? %4\n", + (*aw)->name(), _session->transport_speed(), rolling, + (*aw)->alist()->automation_write())); + if (rolling && (*aw)->alist()->automation_write()) { + (*aw)->list()->set_in_write_pass (true); + } else { + (*aw)->list()->set_in_write_pass (false); + } + } } } |