fix clang compilation (include header ordering)
[ardour.git] / libs / ardour / route.cc
index 598efec6334ee26547443050a2d18e7e6d01a50b..4d473eb7406d2a945c981a830e69f2a4bc49744c 100644 (file)
@@ -96,7 +96,6 @@ Route::Route (Session& sess, string name, PresentationInfo::Flag flag, DataType
        , _active (true)
        , _signal_latency (0)
        , _initial_delay (0)
-       , _roll_delay (0)
        , _disk_io_point (DiskIOPreFader)
        , _pending_process_reorder (0)
        , _pending_signals (0)
@@ -3353,7 +3352,9 @@ Route::non_realtime_transport_stop (samplepos_t now, bool flush)
                }
        }
 
-       _roll_delay = _initial_delay;
+       if (_disk_reader) {
+               _disk_reader->set_roll_delay (_initial_delay);
+       }
 }
 
 void
@@ -3620,7 +3621,7 @@ Route::roll (pframes_t nframes, samplepos_t start_sample, samplepos_t end_sample
                _meter->run (bufs, start_sample, end_sample, 1.0 /*speed()*/, nframes, true);
        }
 
-       passthru (bufs, start_sample, end_sample, nframes, declick, ((_disk_writer && !_disk_writer->record_enabled()) && _session.transport_rolling()));
+       passthru (bufs, start_sample, end_sample, nframes, declick, (!_disk_writer || !_disk_writer->record_enabled()) && _session.transport_rolling());
 
        if ((_disk_reader && _disk_reader->need_butler()) || (_disk_writer && _disk_writer->need_butler())) {
                need_butler = true;
@@ -3878,21 +3879,20 @@ Route::update_signal_latency (bool set_initial_delay)
        Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
 
        samplecnt_t l_in  = _input->latency ();
-       samplecnt_t l_out = 0;
+       samplecnt_t l_out = _output->user_latency();
 
        for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
                if ((*i)->active ()) {
-                       l_out += (*i)->signal_latency ();
                        l_in += (*i)->signal_latency ();
                }
                (*i)->set_input_latency (l_in);
-               (*i)->set_output_latency (l_out);
        }
 
-       l_out += _output->user_latency();
-
-       for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-               (*i)->set_output_latency (l_out - (*i)->output_latency ());
+       for (ProcessorList::reverse_iterator i = _processors.rbegin(); i != _processors.rend(); ++i) {
+               (*i)->set_output_latency (l_out);
+               if ((*i)->active ()) {
+                       l_out += (*i)->signal_latency ();
+               }
        }
 
        DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: internal signal latency = %2\n", _name, l_out));
@@ -3926,8 +3926,8 @@ Route::set_latency_compensation (samplecnt_t longest_session_latency)
        samplecnt_t old = _initial_delay;
        assert (!_disk_reader || _disk_reader->output_latency () <= _signal_latency);
 
-       if (_disk_reader &&  _signal_latency < longest_session_latency) {
-               _initial_delay = longest_session_latency - (_signal_latency - _disk_reader->input_latency ());
+       if (_disk_reader &&  _disk_reader->output_latency () < longest_session_latency) {
+               _initial_delay = longest_session_latency - _disk_reader->output_latency ();
        } else {
                _initial_delay = 0;
        }
@@ -3942,7 +3942,9 @@ Route::set_latency_compensation (samplecnt_t longest_session_latency)
        }
 
        if (_session.transport_stopped()) {
-               _roll_delay = _initial_delay;
+               if (_disk_reader) {
+                       _disk_reader->set_roll_delay (_initial_delay);
+               }
        }
 }
 
@@ -4886,7 +4888,10 @@ Route::non_realtime_locate (samplepos_t pos)
                        (*i)->non_realtime_locate (pos);
                }
        }
-       _roll_delay = _initial_delay;
+
+       if (_disk_reader) {
+               _disk_reader->set_roll_delay (_initial_delay);
+       }
 }
 
 void