From c052aa1d4cbccb1802cdefc02f105c957d037fae Mon Sep 17 00:00:00 2001 From: Alexander Chemeris Date: Wed, 10 Jun 2015 21:47:33 -0400 Subject: uhd: Fix rounding error in timestamp conversion functions. Rounding error introduced oscilating timing advance error by regularly overwriting one bit and then skipping one bit. This commit also adds an error message to show up in logs if this ever happens again. Signed-off-by: Tom Tsou --- Transceiver52M/UHDDevice.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Transceiver52M/UHDDevice.cpp b/Transceiver52M/UHDDevice.cpp index 9038bc1..272ce60 100644 --- a/Transceiver52M/UHDDevice.cpp +++ b/Transceiver52M/UHDDevice.cpp @@ -210,8 +210,7 @@ uhd::time_spec_t convert_time(TIMESTAMP ticks, double rate) TIMESTAMP convert_time(uhd::time_spec_t ts, double rate) { - TIMESTAMP ticks = ts.get_full_secs() * rate; - return ts.get_tick_count(rate) + ticks; + return (TIMESTAMP)(ts.get_real_secs() * rate + 0.5); } /* @@ -1430,6 +1429,19 @@ ssize_t smpl_buf::write(void *buf, size_t len, TIMESTAMP timestamp) if ((timestamp + len) <= time_end) return ERROR_TIMESTAMP; + if (timestamp < time_end) { + LOG(ERR) << "Overwriting old buffer data: timestamp="<