- /* no timecode for 1/4 second ? conclude that its stopped */
- if (last_timestamp &&
- now > last_timestamp &&
- now - last_timestamp > session->frame_rate() / 4) {
- DEBUG_TRACE (DEBUG::MidiClock, "No MIDI Clock frames received for some time, stopping!\n");
- pos = should_be_position;
- session->request_transport_speed (0);
- session->request_locate (should_be_position, false);
- return true;
- } else {
- return false;
- }
-}
-
-bool
-MIDIClock_Slave::speed_and_position (double& speed, framepos_t& pos)
-{
- if (!_started || _starting) {
- speed = 0.0;
- pos = should_be_position;
- return true;
- }
-
- framepos_t engine_now = session->frame_time();
-
- if (stop_if_no_more_clock_events(pos, engine_now)) {
- return false;
- }
-
- // calculate speed
- speed = ((t1 - t0) * session->frame_rate()) / one_ppqn_in_frames;
-
- // provide a 0.1% deadzone to lock the speed
- if (fabs(speed - 1.0) <= 0.001)
- speed = 1.0;
-
- // calculate position
- if (engine_now > last_timestamp) {
- // we are in between MIDI clock messages
- // so we interpolate position according to speed
- framecnt_t elapsed = engine_now - last_timestamp;
- pos = (framepos_t) (should_be_position + double(elapsed) * speed);
- } else {
- // A new MIDI clock message has arrived this cycle
- pos = should_be_position;
- }
-
- DEBUG_TRACE (DEBUG::MidiClock, string_compose ("speed_and_position: speed %1 should-be %2 transport %3 \n", speed, pos, session->transport_frame()));
-
- return true;