X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_ltc.cc;h=51a39d0677c2f6169320aa84454e3b681baa8aaf;hb=6f7f527e1db300fb532390348db132446a211085;hp=2ce25b5a4808853754f969707b918f1db40f21fc;hpb=0da34e65e3470b1c2298ddf571df6356d0d42bd8;p=ardour.git diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc index 2ce25b5a48..51a39d0677 100644 --- a/libs/ardour/session_ltc.cc +++ b/libs/ardour/session_ltc.cc @@ -27,7 +27,7 @@ #include "ardour/session.h" #include "ardour/slave.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -244,13 +244,26 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end /* port latency compensation: * The _generated timecode_ is offset by the port-latency, * therefore the offset depends on the direction of transport. + * + * latency is compensated by adding it to the timecode to + * be generated. e.g. if the signal will reach the output in + * N samples time from now, generate the timecode for (now + N). + * + * sample-sync is achieved by further calculating the difference + * between the timecode and the session-transport and offsetting the + * buffer. + * + * The timecode is generated directly in the Session process callback + * using _transport_frame. It requires that the session has set the + * port's playback latency to worst_playback_latency() prior to + * calling ltc_tx_send_time_code_for_cycle(). */ framepos_t cycle_start_frame; if (current_speed < 0) { - cycle_start_frame = (start_frame - ltc_out_latency.max); + cycle_start_frame = (start_frame - ltc_out_latency.max + worst_playback_latency()); } else if (current_speed > 0) { - cycle_start_frame = (start_frame + ltc_out_latency.max); + cycle_start_frame = (start_frame + ltc_out_latency.max - worst_playback_latency()); } else { /* There is no need to compensate for latency when not rolling * rather send the accurate NOW timecode @@ -262,7 +275,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end /* LTC TV standard offset */ if (current_speed != 0) { /* ditto - send "NOW" if not rolling */ - cycle_start_frame -= ltc_frame_alignment(frames_per_timecode_frame(), TV_STANDARD(cur_timecode)); + cycle_start_frame -= ltc_frame_alignment(samples_per_timecode_frame(), TV_STANDARD(cur_timecode)); } /* cycle-start may become negative due to latency compensation */ @@ -435,7 +448,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end // (4) check if alignment matches - const double fptcf = frames_per_timecode_frame(); + const double fptcf = samples_per_timecode_frame(); /* maximum difference of bit alignment in audio-samples. * @@ -469,8 +482,9 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end rint(ltc_enc_pos + ltc_enc_cnt - poff) - cycle_start_frame )); + const framecnt_t wrap24h = 86400. * frame_rate(); if (ltc_enc_pos < 0 - || (ltc_speed != 0 && fabs(ceil(ltc_enc_pos + ltc_enc_cnt - poff) - cycle_start_frame) > maxdiff) + || (ltc_speed != 0 && fabs(fmod(ceil(ltc_enc_pos + ltc_enc_cnt - poff), wrap24h) - (cycle_start_frame % wrap24h)) > maxdiff) ) { // (5) re-align @@ -478,7 +492,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end /* set frame to encode */ SMPTETimecode tc; - tc.hours = tc_start.hours; + tc.hours = tc_start.hours % 24; tc.mins = tc_start.minutes; tc.secs = tc_start.seconds; tc.frame = tc_start.frames; @@ -541,7 +555,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end return; } - ltc_enc_pos = tc_sample_start; + ltc_enc_pos = tc_sample_start % wrap24h; DEBUG_TRACE (DEBUG::LTC, string_compose("LTC TX5 restart @ %1 + %2 - %3 | byte %4\n", ltc_enc_pos, ltc_enc_cnt, cyc_off, ltc_enc_byte)); @@ -564,7 +578,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end * To do better than this, resampling (or a rewrite of the * encoder) is required. */ - ltc_speed -= ((ltc_enc_pos + ltc_enc_cnt - poff) - cycle_start_frame) / engine().sample_rate(); + ltc_speed -= fmod(((ltc_enc_pos + ltc_enc_cnt - poff) - cycle_start_frame), wrap24h) / engine().sample_rate(); }