X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fltc_slave.cc;h=c5840f68d4f0ad76a306ce356c8efa53b70aeec2;hb=b68a4e5cdc59ffb81c1952ac9cad63ddf0c76d06;hp=ced0226d00ea3c001267a66ac0be6280bd07b447;hpb=2b9421fd391efcddde0be3397cb66e19b744a155;p=ardour.git diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc index ced0226d00..c5840f68d4 100644 --- a/libs/ardour/ltc_slave.cc +++ b/libs/ardour/ltc_slave.cc @@ -52,6 +52,7 @@ LTC_Slave::LTC_Slave (Session& s) delayedlocked = 10; monotonic_cnt = 0; fps_detected=false; + sync_lock_broken = false; ltc_timecode = session.config.get_timecode_format(); a3e_timecode = session.config.get_timecode_format(); @@ -124,6 +125,7 @@ LTC_Slave::resync_xrun() { DEBUG_TRACE (DEBUG::LTC, "LTC resync_xrun()\n"); engine_dll_initstate = 0; + sync_lock_broken = false; } void @@ -131,6 +133,7 @@ LTC_Slave::resync_latency() { DEBUG_TRACE (DEBUG::LTC, "LTC resync_latency()\n"); engine_dll_initstate = 0; + sync_lock_broken = false; if (!session.deletion_in_progress() && session.ltc_output_io()) { /* check if Port exits */ boost::shared_ptr ltcport = session.ltc_input_port(); @@ -147,6 +150,7 @@ LTC_Slave::reset() transport_direction = 0; ltc_speed = 0; engine_dll_initstate = 0; + sync_lock_broken = false; } void @@ -381,6 +385,8 @@ LTC_Slave::process_ltc(framepos_t const /*now*/) timecode_negative_offset, timecode_offset ); + ltc_frame += ltc_slave_latency.max + session.worst_playback_latency(); + framepos_t cur_timestamp = frame.off_end + 1; DEBUG_TRACE (DEBUG::LTC, string_compose ("LTC F: %1 LF: %2 N: %3 L: %4\n", ltc_frame, last_ltc_frame, cur_timestamp, last_timestamp)); if (frame.off_end + 1 <= last_timestamp || last_timestamp == 0) { @@ -436,7 +442,7 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) if (last_timestamp == 0) { engine_dll_initstate = 0; - delayedlocked++; + if (delayedlocked < 10) ++delayedlocked; } else if (engine_dll_initstate != transport_direction && ltc_speed != 0) { engine_dll_initstate = transport_direction; @@ -463,7 +469,7 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) reset(); } - parse_ltc(nframes, in, now - ltc_slave_latency.max ); + parse_ltc(nframes, in, now); process_ltc(now); } @@ -473,7 +479,8 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) pos = session.transport_frame(); return true; } else if (ltc_speed != 0) { - delayedlocked = 0; + if (delayedlocked > 1) delayedlocked--; + else if (current_delta == 0) delayedlocked = 0; } if (abs(now - last_timestamp) > FLYWHEEL_TIMEOUT) { @@ -549,6 +556,11 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) speed = 1.0; } + if (speed != 0 && delayedlocked == 0 && fabsf(speed) != 1.0) { + sync_lock_broken = true; + DEBUG_TRACE (DEBUG::LTC, string_compose ("LTC speed not locked %1 %2\n", speed, ltc_speed)); + } + return true; } @@ -590,7 +602,8 @@ LTC_Slave::approximate_current_delta() const } else if ((monotonic_cnt - last_timestamp) > 2 * frames_per_ltc_frame) { snprintf(delta, sizeof(delta), "%s", _("flywheel")); } else { - snprintf(delta, sizeof(delta), "\u0394%s%s%" PRIi64 "sm", + snprintf(delta, sizeof(delta), "\u0394%s%s%lldsm", + sync_lock_broken ? "red" : "green", LEADINGZERO(llabs(current_delta)), PLUSMINUS(-current_delta), llabs(current_delta)); } return std::string(delta);