Fix automation-write when locating
[ardour.git] / libs / ardour / automation_watch.cc
index d1118e7669303466dfee8648f3dcf63afd0ee849..f3e2ae5f816d53127ddc8c6846aa4c7eb088cd09 100644 (file)
@@ -1,28 +1,32 @@
 /*
-    Copyright (C) 2012 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
+ * Copyright (C) 2012-2017 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2015-2018 Robin Gareus <robin@gareus.org>
+ * Copyright (C) 2015 Ben Loftis <ben@harrisonconsoles.com>
+ * Copyright (C) 2015 Nick Mainsbridge <mainsbridge@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
 
 #include <iostream>
 
 #include <glibmm/timer.h>
 
 #include "pbd/compose.h"
+#include "pbd/pthread_utils.h"
 
+#include "ardour/audioengine.h"
 #include "ardour/automation_control.h"
 #include "ardour/automation_watch.h"
 #include "ardour/debug.h"
@@ -81,9 +85,9 @@ AutomationWatch::add_automation_watch (boost::shared_ptr<AutomationControl> ac)
 
        if (_session && _session->transport_rolling() && ac->alist()->automation_write()) {
                DEBUG_TRACE (DEBUG::Automation, string_compose ("\ttransport is rolling @ %1, audible = %2so enter write pass\n",
-                                                               _session->transport_speed(), _session->audible_frame()));
+                                                               _session->transport_speed(), _session->audible_sample()));
                /* add a guard point since we are already moving */
-               ac->list()->set_in_write_pass (true, true, _session->audible_frame());
+               ac->list()->set_in_write_pass (true, true, _session->audible_sample());
        }
 
        /* we can't store shared_ptr<Destructible> in connections because it
@@ -118,7 +122,7 @@ AutomationWatch::remove_automation_watch (boost::shared_ptr<AutomationControl> a
 }
 
 void
-AutomationWatch::transport_stop_automation_watches (framepos_t when)
+AutomationWatch::transport_stop_automation_watches (samplepos_t when)
 {
        DEBUG_TRACE (DEBUG::Automation, "clear all automation watches\n");
 
@@ -138,7 +142,7 @@ AutomationWatch::transport_stop_automation_watches (framepos_t when)
        }
 
        for (AutomationWatches::iterator i = tmp.begin(); i != tmp.end(); ++i) {
-               (*i)->stop_touch (true, when);
+               (*i)->stop_touch (when);
        }
 }
 
@@ -152,7 +156,7 @@ AutomationWatch::timer ()
        {
                Glib::Threads::Mutex::Lock lm (automation_watch_lock);
 
-               framepos_t time = _session->audible_frame ();
+               samplepos_t time = _session->audible_sample ();
                if (time > _last_time) {  //we only write automation in the forward direction; this fixes automation-recording in a loop
                        for (AutomationWatches::iterator aw = automation_watches.begin(); aw != automation_watches.end(); ++aw) {
                                if ((*aw)->alist()->automation_write()) {
@@ -171,7 +175,7 @@ AutomationWatch::timer ()
                                                                                (*aw)->alist()->automation_write()));
                                (*aw)->list()->set_in_write_pass (false);
                                if ( (*aw)->alist()->automation_write() ) {
-                                       (*aw)->list()->set_in_write_pass (true, time);
+                                       (*aw)->list()->set_in_write_pass (true, true, time);
                                }
                        }
                }
@@ -185,6 +189,7 @@ AutomationWatch::timer ()
 void
 AutomationWatch::thread ()
 {
+       pbd_set_thread_priority (pthread_self(), PBD_SCHED_FIFO, AudioEngine::instance()->client_real_time_priority() - 3);
        while (_run_thread) {
                Glib::usleep ((gulong) floor (Config->get_automation_interval_msecs() * 1000));
                timer ();
@@ -221,7 +226,7 @@ AutomationWatch::transport_state_change ()
 
        bool rolling = _session->transport_rolling();
 
-       _last_time = _session->audible_frame ();
+       _last_time = _session->audible_sample ();
 
        {
                Glib::Threads::Mutex::Lock lm (automation_watch_lock);