fix LTC alignment.
authorRobin Gareus <robin@gareus.org>
Fri, 9 Jan 2015 05:02:36 +0000 (06:02 +0100)
committerRobin Gareus <robin@gareus.org>
Fri, 9 Jan 2015 05:08:15 +0000 (06:08 +0100)
LTC-slave: offset the parsed LTC-frame instead of changing the
frame's timestamp. This fixes an issue with freewheel timeout and
delta-calculation. Align transport-time with output to match
capture alignment: "with existing material".

LTC-generator: follow suit. align clock with master-bus out.
This is a semi-permanent workaround. Once [tracks feeding] the
master-bus is/are delayed to align to output. The generator
needs to use (worst_track_latency not worst_playback_latency)

libs/ardour/ltc_slave.cc
libs/ardour/session_ltc.cc

index 8d570aeeb8476047738a8c46b9968061eaac3d0a..e0da586f3ed347a0508ade322ff4a72e05affd94 100644 (file)
@@ -381,6 +381,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) {
@@ -463,7 +465,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);
        }
 
index 1ac26816410c0ce73fde17cfde0a2b1c16a885d4..2cd21f9afd77b63f7ff902ae1b2a0fbf34afa7a1 100644 (file)
@@ -261,9 +261,9 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
        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