update disk writer input latency at transport stop
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 23 Jun 2017 20:34:12 +0000 (16:34 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 18 Sep 2017 15:40:53 +0000 (11:40 -0400)
libs/ardour/ardour/track.h
libs/ardour/session.cc
libs/ardour/track.cc

index 77755ab088f83656863acc9f8fe5c03b0584a071..33903c2b9178ef83538f916e561df95f7d6b3171 100644 (file)
@@ -83,7 +83,7 @@ class LIBARDOUR_API Track : public Route, public Recordable
        bool can_record();
 
        void set_latency_compensation (framecnt_t);
-
+       void update_latency_information ();
        enum FreezeState {
                NoFreeze,
                Frozen,
@@ -146,7 +146,6 @@ class LIBARDOUR_API Track : public Route, public Recordable
        void ensure_input_monitoring (bool);
        bool destructive () const;
        std::list<boost::shared_ptr<Source> > & last_capture_sources ();
-       void set_capture_offset ();
        std::string steal_write_source_name ();
        void reset_write_sources (bool, bool force = false);
        float playback_buffer_load () const;
index 87adc252758bf4744b9297af3e33c71124ff2e85..01c8bfa62f5db7d00aa9003596250400e078695d 100644 (file)
@@ -5737,7 +5737,7 @@ Session::graph_reordered ()
        for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
                boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
                if (tr) {
-                       tr->set_capture_offset ();
+                       tr->update_latency_information ();
                }
        }
 }
@@ -6936,7 +6936,7 @@ Session::post_capture_latency ()
        for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
                boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
                if (tr) {
-                       tr->set_capture_offset ();
+                       tr->update_latency_information ();
                }
        }
 }
@@ -7045,7 +7045,7 @@ Session::update_latency_compensation (bool force_whole_graph)
                if (!tr) {
                        continue;
                }
-               tr->set_capture_offset ();
+               tr->update_latency_information ();
        }
 }
 
@@ -7378,8 +7378,8 @@ Session::auto_connect_thread_run ()
                        /* this is only used for updating plugin latencies, the
                         * graph does not change. so it's safe in general.
                         * BUT..
-                        * .. update_latency_compensation () entails set_capture_offset()
-                        * which calls Diskstream::set_capture_offset () which
+                        * .. update_latency_compensation () entails Track::update_latency_information()
+                        * which calls DiskWriter::set_capture_offset () which
                         * modifies the capture offset... which can be a proplem
                         * in "prepare_to_stop"
                         */
index d1f49fab630fa7adc7c13d2e1b62d024a60ccd56..c9f581add2b03678376f7654d3c567f2213a0153 100644 (file)
@@ -627,9 +627,15 @@ Track::last_capture_sources ()
 }
 
 void
-Track::set_capture_offset ()
+Track::update_latency_information ()
 {
-       _disk_writer->set_capture_offset ();
+       Glib::Threads::RWLock::ReaderLock lr (_processor_lock);
+       framecnt_t chain_latency = _input->latency ();
+
+       for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
+               (*p)->set_input_latency (chain_latency);
+               chain_latency += (*p)->signal_latency ();
+       }
 }
 
 std::string