diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp index 2e9c39e0c..7f9c9ab62 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp @@ -14,7 +14,6 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#include #include #include #include @@ -420,9 +419,9 @@ void SDRdaemonSinkOutput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSetti void SDRdaemonSinkOutput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response) { - struct timeval tv; + uint64_t ts_usecs; response.getSdrDaemonSinkReport()->setBufferRwBalance(m_sampleSourceFifo.getRWBalance()); - response.getSdrDaemonSinkReport()->setSampleCount(m_sdrDaemonSinkThread ? (int) m_sdrDaemonSinkThread->getSamplesCount(tv) : 0); + response.getSdrDaemonSinkReport()->setSampleCount(m_sdrDaemonSinkThread ? (int) m_sdrDaemonSinkThread->getSamplesCount(ts_usecs) : 0); } void SDRdaemonSinkOutput::tick() @@ -504,8 +503,8 @@ void SDRdaemonSinkOutput::analyzeApiReply(const QJsonObject& jsonObject) } uint32_t sampleCountDelta, sampleCount; - struct timeval tv; - sampleCount = m_sdrDaemonSinkThread->getSamplesCount(tv); + uint64_t timestampUs; + sampleCount = m_sdrDaemonSinkThread->getSamplesCount(timestampUs); if (sampleCount < m_lastSampleCount) { sampleCountDelta = (0xFFFFFFFFU - m_lastSampleCount) + sampleCount + 1; @@ -513,8 +512,6 @@ void SDRdaemonSinkOutput::analyzeApiReply(const QJsonObject& jsonObject) sampleCountDelta = sampleCount - m_lastSampleCount; } - uint64_t timestampUs = tv.tv_sec*1000000ULL + tv.tv_usec; - // on initial state wait for queue stabilization if ((m_lastRemoteTimestampRateCorrection == 0) && (queueLength >= m_lastQueueLength-1) && (queueLength <= m_lastQueueLength+1)) { diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkthread.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkthread.cpp index bbe966cb8..a412b7efb 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkthread.cpp +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkthread.cpp @@ -14,7 +14,6 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#include #include #include #include @@ -22,6 +21,7 @@ #include #include "dsp/samplesourcefifo.h" +#include "util/timeutil.h" #include "sdrdaemonsinkthread.h" SDRdaemonSinkThread::SDRdaemonSinkThread(SampleSourceFifo* sampleFifo, QObject* parent) : @@ -140,8 +140,8 @@ void SDRdaemonSinkThread::tick() } } -uint32_t SDRdaemonSinkThread::getSamplesCount(struct timeval& tv) const +uint32_t SDRdaemonSinkThread::getSamplesCount(uint64_t& ts_usecs) const { - gettimeofday(&tv, 0); + ts_usecs = TimeUtil::nowus(); return m_samplesCount; } diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkthread.h b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkthread.h index e6a2fd91a..af6f09440 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkthread.h +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkthread.h @@ -55,7 +55,7 @@ public: bool isRunning() const { return m_running; } - uint32_t getSamplesCount(struct timeval& tv) const; + uint32_t getSamplesCount(uint64_t& ts_usecs) const; void setSamplesCount(int samplesCount) { m_samplesCount = samplesCount; } void setChunkCorrection(int chunkCorrection) { m_chunkCorrection = chunkCorrection; } diff --git a/plugins/samplesink/sdrdaemonsink/udpsinkfec.cpp b/plugins/samplesink/sdrdaemonsink/udpsinkfec.cpp index cd1b6fb0f..14b9ef820 100644 --- a/plugins/samplesink/sdrdaemonsink/udpsinkfec.cpp +++ b/plugins/samplesink/sdrdaemonsink/udpsinkfec.cpp @@ -16,11 +16,10 @@ #include -#include -#include #include #include +#include "util/timeutil.h" #include "udpsinkfec.h" #include "udpsinkfecworker.h" @@ -118,10 +117,9 @@ void UDPSinkFEC::write(const SampleVector::iterator& begin, uint32_t sampleChunk if (m_txBlockIndex == 0) // Tx block index 0 is a block with only meta data { - struct timeval tv; SDRDaemonMetaDataFEC metaData; - gettimeofday(&tv, 0); + uint64_t ts_usecs = TimeUtil::nowus(); metaData.m_centerFrequency = 0; // frequency not set by stream metaData.m_sampleRate = m_sampleRate; @@ -129,8 +127,8 @@ void UDPSinkFEC::write(const SampleVector::iterator& begin, uint32_t sampleChunk metaData.m_sampleBits = SDR_RX_SAMP_SZ; metaData.m_nbOriginalBlocks = m_nbOriginalBlocks; metaData.m_nbFECBlocks = m_nbBlocksFEC; - metaData.m_tv_sec = tv.tv_sec; - metaData.m_tv_usec = tv.tv_usec; + metaData.m_tv_sec = ts_usecs / 1000000UL; + metaData.m_tv_usec = ts_usecs % 1000000UL; boost::crc_32_type crc32; crc32.process_bytes(&metaData, 20); diff --git a/sdrbase/util/timeutil.cpp b/sdrbase/util/timeutil.cpp index ce405bcc8..a4caa9739 100644 --- a/sdrbase/util/timeutil.cpp +++ b/sdrbase/util/timeutil.cpp @@ -25,3 +25,13 @@ uint64_t TimeUtil::nowms() return value.count(); } + +uint64_t TimeUtil::nowus() +{ + auto now = std::chrono::system_clock::now(); + auto now_ms = std::chrono::time_point_cast(now); + auto epoch = now_ms.time_since_epoch(); + auto value = std::chrono::duration_cast(epoch); + + return value.count(); +} diff --git a/sdrbase/util/timeutil.h b/sdrbase/util/timeutil.h index cd983a8d7..fa2303205 100644 --- a/sdrbase/util/timeutil.h +++ b/sdrbase/util/timeutil.h @@ -23,4 +23,5 @@ class SDRBASE_API TimeUtil { public: static uint64_t nowms(); //!< returns the current epoch in milliseconds + static uint64_t nowus(); //!< returns the current epoch in microseconds };