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
};