X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_ltc.cc;h=8acb16dde30ea7f9247aac42958c45f36bbe0596;hb=fb430a7738d4d6d38de8ac3fba491c3572bed386;hp=2cd21f9afd77b63f7ff902ae1b2a0fbf34afa7a1;hpb=ced4378d0914bcfb926267772c45d1d23f3bed38;p=ardour.git diff --git a/libs/ardour/session_ltc.cc b/libs/ardour/session_ltc.cc index 2cd21f9afd..8acb16dde3 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; @@ -64,6 +64,7 @@ using namespace Timecode; void Session::ltc_tx_initialize() { + assert (!ltc_encoder && !ltc_enc_buf); ltc_enc_tcformat = config.get_timecode_format(); ltc_tx_parse_offset(); @@ -84,8 +85,8 @@ Session::ltc_tx_initialize() ltc_prev_cycle = -1; ltc_tx_reset(); ltc_tx_resync_latency(); - Xrun.connect_same_thread (*this, boost::bind (&Session::ltc_tx_reset, this)); - engine().GraphReordered.connect_same_thread (*this, boost::bind (&Session::ltc_tx_resync_latency, this)); + Xrun.connect_same_thread (ltc_tx_connections, boost::bind (&Session::ltc_tx_reset, this)); + engine().GraphReordered.connect_same_thread (ltc_tx_connections, boost::bind (&Session::ltc_tx_resync_latency, this)); restarting = false; } @@ -93,6 +94,7 @@ void Session::ltc_tx_cleanup() { DEBUG_TRACE (DEBUG::LTC, "LTC TX cleanup\n"); + ltc_tx_connections.drop_connections (); free(ltc_enc_buf); ltc_enc_buf = NULL; ltc_encoder_free(ltc_encoder); @@ -115,6 +117,7 @@ void Session::ltc_tx_reset() { DEBUG_TRACE (DEBUG::LTC, "LTC TX reset\n"); + assert (ltc_encoder); ltc_enc_pos = -9999; // force re-start ltc_buf_len = 0; ltc_buf_off = 0; @@ -168,6 +171,12 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end pframes_t txf = 0; boost::shared_ptr ltcport = ltc_output_port(); + if (!ltcport) { + assert (deletion_in_progress ()); + return; + } + + /* marks buffer as not written */ Buffer& buf (ltcport->get_buffer (nframes)); if (!ltc_encoder || !ltc_enc_buf) { @@ -275,7 +284,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 */ @@ -448,7 +457,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. * @@ -482,8 +491,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 @@ -491,7 +501,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; @@ -554,7 +564,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)); @@ -577,7 +587,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(); }