From 09599e145e3495e98ffc9cbe304f2d2a401b9a18 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 15 Mar 2022 22:21:06 +0100 Subject: [PATCH] Added signals to SampleSinkFifo including samples timings. Implements #1143 and part of #1139 --- plugins/samplesource/rtlsdr/rtlsdrinput.cpp | 2 + sdrbase/dsp/samplesinkfifo.cpp | 46 ++++++++++++++++++++- sdrbase/dsp/samplesinkfifo.h | 7 ++++ sdrbase/maincore.cpp | 2 + sdrbase/maincore.h | 5 +++ 5 files changed, 60 insertions(+), 2 deletions(-) diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp index c2f3a65f8..0039ce08a 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp @@ -100,6 +100,8 @@ bool RTLSDRInput::openDevice() return false; } + m_sampleFifo.setWrittenSignalRateDivider(32); + int device; if ((device = rtlsdr_get_index_by_serial(qPrintable(m_deviceAPI->getSamplingDeviceSerial()))) < 0) diff --git a/sdrbase/dsp/samplesinkfifo.cpp b/sdrbase/dsp/samplesinkfifo.cpp index fc5e98fac..03c906537 100644 --- a/sdrbase/dsp/samplesinkfifo.cpp +++ b/sdrbase/dsp/samplesinkfifo.cpp @@ -16,6 +16,7 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// +#include "maincore.h" #include "samplesinkfifo.h" //#define MIN(x, y) (((x) < (y)) ? (x) : (y)) @@ -42,6 +43,9 @@ void SampleSinkFifo::reset() SampleSinkFifo::SampleSinkFifo(QObject* parent) : QObject(parent), m_data(), + m_total(0), + m_writtenSignalCount(0), + m_writtenSignalRateDivider(1), m_mutex(QMutex::Recursive) { m_suppressed = -1; @@ -54,6 +58,9 @@ SampleSinkFifo::SampleSinkFifo(QObject* parent) : SampleSinkFifo::SampleSinkFifo(int size, QObject* parent) : QObject(parent), m_data(), + m_total(0), + m_writtenSignalCount(0), + m_writtenSignalRateDivider(1), m_mutex(QMutex::Recursive) { m_suppressed = -1; @@ -63,6 +70,9 @@ SampleSinkFifo::SampleSinkFifo(int size, QObject* parent) : SampleSinkFifo::SampleSinkFifo(const SampleSinkFifo& other) : QObject(other.parent()), m_data(other.m_data), + m_total(0), + m_writtenSignalCount(0), + m_writtenSignalRateDivider(1), m_mutex(QMutex::Recursive) { m_suppressed = -1; @@ -85,6 +95,12 @@ bool SampleSinkFifo::setSize(int size) return m_data.size() == (unsigned int)size; } +void SampleSinkFifo::setWrittenSignalRateDivider(unsigned int divider) +{ + QMutexLocker mutexLocker(&m_mutex); + m_writtenSignalRateDivider = divider; +} + unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count) { QMutexLocker mutexLocker(&m_mutex); @@ -108,6 +124,7 @@ unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count) m_suppressed = 0; m_msgRateTimer.start(); qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total); + emit overflow(count - total); } else { @@ -115,6 +132,7 @@ unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count) { qCritical("SampleSinkFifo::write: %u messages dropped", m_suppressed); qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total); + emit overflow(count - total); m_suppressed = -1; } else @@ -141,6 +159,15 @@ unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count) emit dataReady(); } + m_total += total; + + if (++m_writtenSignalCount >= m_writtenSignalRateDivider) + { + emit written(m_total, MainCore::instance()->getElapsedNsecs()); + m_total = 0; + m_writtenSignalCount = 0; + } + return total; } @@ -166,6 +193,7 @@ unsigned int SampleSinkFifo::write(SampleVector::const_iterator begin, SampleVec m_suppressed = 0; m_msgRateTimer.start(); qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total); + emit overflow(count - total); } else { @@ -173,6 +201,7 @@ unsigned int SampleSinkFifo::write(SampleVector::const_iterator begin, SampleVec { qCritical("SampleSinkFifo::write: %u messages dropped", m_suppressed); qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total); + emit overflow(count - total); m_suppressed = -1; } else @@ -199,6 +228,15 @@ unsigned int SampleSinkFifo::write(SampleVector::const_iterator begin, SampleVec emit dataReady(); } + m_total += total; + + if (++m_writtenSignalCount >= m_writtenSignalRateDivider) + { + emit written(m_total, MainCore::instance()->getElapsedNsecs()); + m_total = 0; + m_writtenSignalCount = 0; + } + return total; } @@ -217,8 +255,10 @@ unsigned int SampleSinkFifo::read(SampleVector::iterator begin, SampleVector::it total = std::min(count, m_fill); - if (total < count) { + if (total < count) + { qCritical("SampleSinkFifo::read: underflow - missing %u samples", count - total); + emit underflow(count - total); } remaining = total; @@ -254,8 +294,10 @@ unsigned int SampleSinkFifo::readBegin(unsigned int count, total = std::min(count, m_fill); - if (total < count) { + if (total < count) + { qCritical("SampleSinkFifo::readBegin: underflow - missing %u samples", count - total); + emit underflow(count - total); } remaining = total; diff --git a/sdrbase/dsp/samplesinkfifo.h b/sdrbase/dsp/samplesinkfifo.h index 64c93912e..c20e9784b 100644 --- a/sdrbase/dsp/samplesinkfifo.h +++ b/sdrbase/dsp/samplesinkfifo.h @@ -32,6 +32,9 @@ private: QElapsedTimer m_msgRateTimer; int m_suppressed; SampleVector m_data; + int m_total; + unsigned int m_writtenSignalCount; + unsigned int m_writtenSignalRateDivider; QMutex m_mutex; unsigned int m_size; @@ -49,6 +52,7 @@ public: bool setSize(int size); void reset(); + void setWrittenSignalRateDivider(unsigned int divider); inline unsigned int size() { QMutexLocker mutexLocker(&m_mutex); unsigned int size = m_size; return size; } inline unsigned int fill() { QMutexLocker mutexLocker(&m_mutex); unsigned int fill = m_fill; return fill; } @@ -65,6 +69,9 @@ public: signals: void dataReady(); + void written(int nsamples, qint64 timestamp); + void overflow(int nsamples); + void underflow(int nsamples); }; #endif // INCLUDE_SAMPLEFIFO_H diff --git a/sdrbase/maincore.cpp b/sdrbase/maincore.cpp index 96eb24b89..e99e777d8 100644 --- a/sdrbase/maincore.cpp +++ b/sdrbase/maincore.cpp @@ -62,6 +62,8 @@ MainCore::MainCore() { m_masterTimer.setTimerType(Qt::PreciseTimer); m_masterTimer.start(50); + m_startMsecsSinceEpoch = QDateTime::currentMSecsSinceEpoch(); + m_masterElapsedTimer.start(); } MainCore::~MainCore() diff --git a/sdrbase/maincore.h b/sdrbase/maincore.h index b3e1cfdf0..8477cc9f9 100644 --- a/sdrbase/maincore.h +++ b/sdrbase/maincore.h @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -706,6 +707,8 @@ public: static MainCore *instance(); const QTimer& getMasterTimer() const { return m_masterTimer; } + qint64 getElapsedNsecs() const { return m_masterElapsedTimer.nsecsElapsed(); } //!< Elapsed nanoseconds since main core construction + qint64 getStartMsecsSinceEpoch() const { return m_startMsecsSinceEpoch; } //!< Epoch timestamp in millisecodns close to elapsed timer start const MainSettings& getSettings() const { return m_settings; } MessageQueue *getMainMessageQueue() { return m_mainMessageQueue; } const PluginManager *getPluginManager() const { return m_pluginManager; } @@ -760,6 +763,8 @@ private: MessageQueue *m_mainMessageQueue; int m_masterTabIndex; QTimer m_masterTimer; + QElapsedTimer m_masterElapsedTimer; + qint64 m_startMsecsSinceEpoch; std::vector m_deviceSets; std::vector m_featureSets; QMap m_deviceSetsMap; //!< Device set instance to device set index map