X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fltc_slave.cc;h=8d08fd6bb5ab9184e77ba559d65ed6843af0bf7a;hb=985e3dcc50fc7dd66a258ae0758956a1fff8f3bd;hp=7b182cfa64949a8bf2e5176327fc5d013f4f035e;hpb=e1581242ca8554660ea68290688e573a9acfca06;p=ardour.git diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc index 7b182cfa64..8d08fd6bb5 100644 --- a/libs/ardour/ltc_slave.cc +++ b/libs/ardour/ltc_slave.cc @@ -95,7 +95,6 @@ void LTC_Slave::parameter_changed (std::string const & p) { if (p == "slave-timecode-offset" - || p == "subframes-per-frame" || p == "timecode-format" ) { parse_timecode_offset(); @@ -200,9 +199,9 @@ LTC_Slave::detect_discontinuity(LTCFrameExt *frame, int fps, bool fuzzy) { } if (frame->reverse) { - ltc_frame_decrement(&prev_frame.ltc, fps , 0); + ltc_frame_decrement(&prev_frame.ltc, fps, LTC_TV_525_60, 0); } else { - ltc_frame_increment(&prev_frame.ltc, fps , 0); + ltc_frame_increment(&prev_frame.ltc, fps, LTC_TV_525_60, 0); } if (!equal_ltc_frame_time(&prev_frame.ltc, &frame->ltc)) { discontinuity_detected = true; @@ -295,9 +294,10 @@ LTC_Slave::detect_ltc_fps(int frameno, bool df) } void -LTC_Slave::process_ltc(framepos_t const now) +LTC_Slave::process_ltc(framepos_t const /*now*/) { LTCFrameExt frame; + enum LTC_TV_STANDARD tv_standard = LTC_TV_625_50; while (ltc_decoder_read(decoder, &frame)) { SMPTETimecode stime; @@ -337,15 +337,34 @@ LTC_Slave::process_ltc(framepos_t const now) * is expected to start at the end of the current frame */ int fps_i = ceil(timecode.rate); + + switch(fps_i) { + case 30: + if (timecode.drop) { + tv_standard = LTC_TV_525_60; + } else { + tv_standard = LTC_TV_1125_60; + } + break; + case 25: + tv_standard = LTC_TV_625_50; + break; + default: + tv_standard = LTC_TV_FILM_24; /* == LTC_TV_1125_60 == no offset, 24,30fps BGF */ + break; + } + if (!frame.reverse) { - ltc_frame_increment(&frame.ltc, fps_i , 0); + ltc_frame_increment(&frame.ltc, fps_i, tv_standard, 0); ltc_frame_to_time(&stime, &frame.ltc, 0); transport_direction = 1; + frame.off_start -= ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard); + frame.off_end -= ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard); } else { - ltc_frame_decrement(&frame.ltc, fps_i , 0); + ltc_frame_decrement(&frame.ltc, fps_i, tv_standard, 0); int off = frame.off_end - frame.off_start; - frame.off_start += off; - frame.off_end += off; + frame.off_start += off - ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard); + frame.off_end += off - ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard); transport_direction = -1; } @@ -557,7 +576,7 @@ std::string LTC_Slave::approximate_current_position() const { if (last_timestamp == 0) { - return " \u2012\u2012:\u2012\u2012:\u2012\u2012:\u2012\u2012"; + return " --:--:--:--"; } return Timecode::timecode_format_time(timecode); } @@ -571,7 +590,7 @@ LTC_Slave::approximate_current_delta() const } else if ((monotonic_cnt - last_timestamp) > 2 * frames_per_ltc_frame) { snprintf(delta, sizeof(delta), _("flywheel")); } else { - snprintf(delta, sizeof(delta), "\u0394%s%s%" PRIi64 " sm", + snprintf(delta, sizeof(delta), "\u0394%s%s%" PRIi64 "sm", LEADINGZERO(abs(current_delta)), PLUSMINUS(-current_delta), abs(current_delta)); } return std::string(delta);