diff options
author | Robin Gareus <robin@gareus.org> | 2017-07-26 22:54:31 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-07-26 22:58:16 +0200 |
commit | 28c29ab22dfb13ca185175ed94ba2d27c72489cf (patch) | |
tree | d2d7671b6b248b9058621b251894fd65ded5d5d9 /libs | |
parent | b804109e8ec24e6c2201e4e317ca91ed01ba5245 (diff) |
Fix initial sync to LTC with small buffersizes
Ardour follow_slave() does nothing (not even seek) if the slave is not
locked.
The LTC-slave assumes it's locked if LTC is stable for 5 continuous
process-calls.
If the difference of Ardour's transport-position to the LTC-timecode
is large (> 2sec), the slave reset itself (assuming drift, seek don't vari-
speed).
A LTC-slave does reset does reset the locked counter.
Hence: If initially Ardour's transport differs > 2 sec and the buffersize
is small (many process-callbacks), the slave kept resetting itself
never informing Ardour that it locked to the external TC, and Ardour
never issued a seek.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/slave.h | 2 | ||||
-rw-r--r-- | libs/ardour/ltc_slave.cc | 13 |
2 files changed, 8 insertions, 7 deletions
diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h index cf8060d029..80ff208572 100644 --- a/libs/ardour/ardour/slave.h +++ b/libs/ardour/ardour/slave.h @@ -364,7 +364,7 @@ public: bool detect_discontinuity(LTCFrameExt *, int, bool); bool detect_ltc_fps(int, bool); bool equal_ltc_frame_time(LTCFrame *a, LTCFrame *b); - void reset(); + void reset (bool with_ts = true); void resync_xrun(); void resync_latency(); void parse_timecode_offset(); diff --git a/libs/ardour/ltc_slave.cc b/libs/ardour/ltc_slave.cc index 2501378017..04af930f0e 100644 --- a/libs/ardour/ltc_slave.cc +++ b/libs/ardour/ltc_slave.cc @@ -143,11 +143,13 @@ LTC_Slave::resync_latency() } void -LTC_Slave::reset() +LTC_Slave::reset (bool with_ts) { DEBUG_TRACE (DEBUG::LTC, "LTC reset()\n"); - last_timestamp = 0; - current_delta = 0; + if (with_ts) { + last_timestamp = 0; + current_delta = 0; + } transport_direction = 0; ltc_speed = 0; engine_dll_initstate = 0; @@ -466,7 +468,7 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) DEBUG_TRACE (DEBUG::LTC, string_compose("engine skipped %1 frames. Feeding silence to LTC parser.\n", skip)); if (skip >= 8192) skip = 8192; unsigned char sound[8192]; - memset(sound, 0, sizeof(char) * skip); + memset(sound, 0x80, sizeof(char) * skip); ltc_decoder_write(decoder, sound, nframes, now); } else if (skip != 0) { /* this should never happen. it may if monotonic_cnt, now overflow on 64bit */ @@ -548,9 +550,8 @@ LTC_Slave::speed_and_position (double& speed, framepos_t& pos) if (((pos < 0) || (labs(current_delta) > 2 * session.frame_rate()))) { DEBUG_TRACE (DEBUG::LTC, string_compose ("LTC large drift: %1\n", current_delta)); - reset(); + reset(false); speed = 0; - pos = session.transport_frame(); return true; } |