X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fltc_slave.cc;h=6167c6bda226b55bef0803e276d50ada6e7d0806;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=ced0226d00ea3c001267a66ac0be6280bd07b447;hpb=a882e96db1367c26660fd3d3079e9e3e19b1e149;p=ardour.git diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc index ced0226d00..6167c6bda2 100644 --- a/libs/ardour/ltc_slave.cc +++ b/libs/ardour/ltc_slave.cc @@ -26,12 +26,13 @@ #include "pbd/pthread_utils.h" #include "ardour/debug.h" +#include "ardour/profile.h" #include "ardour/slave.h" #include "ardour/session.h" #include "ardour/audioengine.h" #include "ardour/audio_port.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -52,6 +53,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 +126,7 @@ LTC_Slave::resync_xrun() { DEBUG_TRACE (DEBUG::LTC, "LTC resync_xrun()\n"); engine_dll_initstate = 0; + sync_lock_broken = false; } void @@ -131,6 +134,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 +151,9 @@ LTC_Slave::reset() transport_direction = 0; ltc_speed = 0; engine_dll_initstate = 0; + sync_lock_broken = false; + + ActiveChanged (false); /* EMIT SIGNAL */ } void @@ -381,6 +388,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,9 +445,11 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) if (last_timestamp == 0) { engine_dll_initstate = 0; - delayedlocked++; - } - else if (engine_dll_initstate != transport_direction && ltc_speed != 0) { + if (delayedlocked < 10) ++delayedlocked; + } else if (engine_dll_initstate != transport_direction && ltc_speed != 0) { + + ActiveChanged (true); /* EMIT SIGNAL */ + engine_dll_initstate = transport_direction; init_engine_dll(last_ltc_frame + rint(ltc_speed * double(2 * nframes + now - last_timestamp)), session.engine().samples_per_cycle()); @@ -463,7 +474,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 +484,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) { @@ -481,6 +493,7 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) reset(); speed = 0; pos = session.transport_frame(); + ActiveChanged (false); /* EMIT SIGNAL */ return true; } @@ -549,6 +562,11 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) speed = 1.0; } + if (speed != 0 && delayedlocked == 0 && fabs(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,8 +608,9 @@ 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", - LEADINGZERO(llabs(current_delta)), PLUSMINUS(-current_delta), llabs(current_delta)); + 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); }