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