fix crash when copy'ing latent plugins
[ardour.git] / libs / ardour / session_ltc.cc
index 2671bfccf40b6b9589460ef74a9433f2ef5a3eca..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;
@@ -55,7 +55,7 @@ using namespace Timecode;
  * This filter is adaptive so that fast vari-speed signals
  * will not be affected by it.
  */
-#define LTC_RISE_TIME(speed) MIN (100, MAX(40, (4000000 / ((speed==0)?1:speed) / engine().frame_rate())))
+#define LTC_RISE_TIME(speed) MIN (100, MAX(40, (4000000 / ((speed==0)?1:speed) / engine().sample_rate())))
 
 #define TV_STANDARD(tcf) \
        (timecode_to_frames_per_second(tcf)==25.0 ? LTC_TV_625_50 : \
@@ -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
@@ -564,7 +577,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().frame_rate();
+               ltc_speed -= ((ltc_enc_pos + ltc_enc_cnt - poff) - cycle_start_frame) / engine().sample_rate();
        }