+ /* it take 2 cycles from naught to rolling.
+ * during these to initial cycles the speed == 0
+ *
+ * the first cycle:
+ * DEBUG::Slave: slave stopped, move to NNN
+ * DEBUG::Transport: Request forced locate to NNN
+ * DEBUG::Slave: slave state 0 @ NNN speed 0 cur delta VERY-LARGE-DELTA avg delta 1800
+ * DEBUG::Slave: silent motion
+ * DEBUG::Transport: realtime stop @ NNN
+ * DEBUG::Transport: Butler transport work, todo = PostTransportStop,PostTransportLocate,PostTransportClearSubstate
+ *
+ * [engine skips frames to locate, jack time keeps rolling on]
+ *
+ * the second cycle:
+ *
+ * DEBUG::LTC: [re-]init Engine DLL
+ * DEBUG::Slave: slave stopped, move to NNN+
+ * ...
+ *
+ * we need to seek two cycles ahead: 2 * nframes
+ */
+ if (engine_dll_initstate == 0) {
+ DEBUG_TRACE (DEBUG::LTC, "engine DLL not initialized. ltc_speed\n");
+ speed = 0;
+ pos = last_ltc_frame + rint(ltc_speed * double(2 * nframes + now - last_timestamp));
+ return true;
+ }
+
+ /* interpolate position according to speed and time since last LTC-frame*/
+ double speed_flt = ltc_speed;
+ double elapsed = (now - last_timestamp) * speed_flt;
+
+ if (!engine_init_called) {
+ const double e = elapsed + double (last_ltc_frame - sess_pos);
+ t0 = t1;
+ t1 += b * e + e2;
+ e2 += c * e;
+ speed_flt = (t1 - t0) / double(session.engine().samples_per_cycle());
+ DEBUG_TRACE (DEBUG::LTC, string_compose ("LTC engine DLL t0:%1 t1:%2 err:%3 spd:%4 ddt:%5\n", t0, t1, e, speed_flt, e2 - session.engine().samples_per_cycle() ));
+ } else {
+ DEBUG_TRACE (DEBUG::LTC, string_compose ("LTC adjusting elapsed (no DLL) from %1 by %2\n", elapsed, (2 * nframes * ltc_speed)));
+ speed_flt = 0;
+ elapsed += 2.0 * nframes * ltc_speed; /* see note above */
+ }
+
+ pos = last_ltc_frame + rint(elapsed);
+ speed = speed_flt;
+ current_delta = (pos - sess_pos);
+
+ if (((pos < 0) || (labs(current_delta) > 2 * session.frame_rate()))) {
+ DEBUG_TRACE (DEBUG::LTC, string_compose ("LTC large drift: %1\n", current_delta));