+samplecnt_t
+Send::signal_latency () const
+{
+ if (!_pending_active) {
+ return 0;
+ }
+ if (_user_latency) {
+ return _user_latency;
+ }
+ if (_delay_out > _delay_in) {
+ return _delay_out - _delay_in;
+ }
+ return 0;
+}
+
+void
+Send::update_delaylines ()
+{
+ if (_role == Listen) {
+ /* Don't align monitor-listen (just yet).
+ * They're present on each route, may change positions
+ * and could potentially signficiantly increase worst-case
+ * Latency: In PFL mode all tracks/busses would additionally be
+ * aligned at PFL position.
+ *
+ * We should only align active monitor-sends when at least one is active.
+ */
+ return;
+ }
+
+ bool changed;
+ if (_delay_out > _delay_in) {
+ changed = _thru_delay->set_delay(_delay_out - _delay_in);
+ _send_delay->set_delay(0);
+ } else {
+ changed = _thru_delay->set_delay(0);
+ _send_delay->set_delay(_delay_in - _delay_out);
+ }
+
+ if (changed) {
+ // TODO -- ideally postpone for effective no-op changes
+ // (in case both _delay_out and _delay_in are changed by the
+ // same amount in a single latency-update cycle).
+ ChangedLatency (); /* EMIT SIGNAL */
+ }
+}
+
+void
+Send::set_delay_in (samplecnt_t delay)
+{
+ if (_delay_in == delay) {
+ return;
+ }
+ _delay_in = delay;
+
+ DEBUG_TRACE (DEBUG::LatencyCompensation,
+ string_compose ("Send::set_delay_in %1: (%2) - %3 = %4\n",
+ name (), _delay_in, _delay_out, _delay_in - _delay_out));
+
+ update_delaylines ();
+}
+