fix crash when copy'ing latent plugins
[ardour.git] / libs / ardour / session_ltc.cc
index 2ce25b5a4808853754f969707b918f1db40f21fc..945f96519e3f60a8c7ed1c7483eacf9b8d0c4e47 100644 (file)
@@ -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