1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-06-25 05:25:27 -04:00

Added signals to SampleSinkFifo including samples timings. Implements #1143 and part of #1139

This commit is contained in:
f4exb 2022-03-15 22:21:06 +01:00
parent a1babc9706
commit 09599e145e
5 changed files with 60 additions and 2 deletions

View File

@ -100,6 +100,8 @@ bool RTLSDRInput::openDevice()
return false; return false;
} }
m_sampleFifo.setWrittenSignalRateDivider(32);
int device; int device;
if ((device = rtlsdr_get_index_by_serial(qPrintable(m_deviceAPI->getSamplingDeviceSerial()))) < 0) if ((device = rtlsdr_get_index_by_serial(qPrintable(m_deviceAPI->getSamplingDeviceSerial()))) < 0)

View File

@ -16,6 +16,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // // along with this program. If not, see <http://www.gnu.org/licenses/>. //
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include "maincore.h"
#include "samplesinkfifo.h" #include "samplesinkfifo.h"
//#define MIN(x, y) (((x) < (y)) ? (x) : (y)) //#define MIN(x, y) (((x) < (y)) ? (x) : (y))
@ -42,6 +43,9 @@ void SampleSinkFifo::reset()
SampleSinkFifo::SampleSinkFifo(QObject* parent) : SampleSinkFifo::SampleSinkFifo(QObject* parent) :
QObject(parent), QObject(parent),
m_data(), m_data(),
m_total(0),
m_writtenSignalCount(0),
m_writtenSignalRateDivider(1),
m_mutex(QMutex::Recursive) m_mutex(QMutex::Recursive)
{ {
m_suppressed = -1; m_suppressed = -1;
@ -54,6 +58,9 @@ SampleSinkFifo::SampleSinkFifo(QObject* parent) :
SampleSinkFifo::SampleSinkFifo(int size, QObject* parent) : SampleSinkFifo::SampleSinkFifo(int size, QObject* parent) :
QObject(parent), QObject(parent),
m_data(), m_data(),
m_total(0),
m_writtenSignalCount(0),
m_writtenSignalRateDivider(1),
m_mutex(QMutex::Recursive) m_mutex(QMutex::Recursive)
{ {
m_suppressed = -1; m_suppressed = -1;
@ -63,6 +70,9 @@ SampleSinkFifo::SampleSinkFifo(int size, QObject* parent) :
SampleSinkFifo::SampleSinkFifo(const SampleSinkFifo& other) : SampleSinkFifo::SampleSinkFifo(const SampleSinkFifo& other) :
QObject(other.parent()), QObject(other.parent()),
m_data(other.m_data), m_data(other.m_data),
m_total(0),
m_writtenSignalCount(0),
m_writtenSignalRateDivider(1),
m_mutex(QMutex::Recursive) m_mutex(QMutex::Recursive)
{ {
m_suppressed = -1; m_suppressed = -1;
@ -85,6 +95,12 @@ bool SampleSinkFifo::setSize(int size)
return m_data.size() == (unsigned 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) unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count)
{ {
QMutexLocker mutexLocker(&m_mutex); QMutexLocker mutexLocker(&m_mutex);
@ -108,6 +124,7 @@ unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count)
m_suppressed = 0; m_suppressed = 0;
m_msgRateTimer.start(); m_msgRateTimer.start();
qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total); qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total);
emit overflow(count - total);
} }
else 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: %u messages dropped", m_suppressed);
qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total); qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total);
emit overflow(count - total);
m_suppressed = -1; m_suppressed = -1;
} }
else else
@ -141,6 +159,15 @@ unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count)
emit dataReady(); 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; return total;
} }
@ -166,6 +193,7 @@ unsigned int SampleSinkFifo::write(SampleVector::const_iterator begin, SampleVec
m_suppressed = 0; m_suppressed = 0;
m_msgRateTimer.start(); m_msgRateTimer.start();
qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total); qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total);
emit overflow(count - total);
} }
else 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: %u messages dropped", m_suppressed);
qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total); qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total);
emit overflow(count - total);
m_suppressed = -1; m_suppressed = -1;
} }
else else
@ -199,6 +228,15 @@ unsigned int SampleSinkFifo::write(SampleVector::const_iterator begin, SampleVec
emit dataReady(); 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; return total;
} }
@ -217,8 +255,10 @@ unsigned int SampleSinkFifo::read(SampleVector::iterator begin, SampleVector::it
total = std::min(count, m_fill); total = std::min(count, m_fill);
if (total < count) { if (total < count)
{
qCritical("SampleSinkFifo::read: underflow - missing %u samples", count - total); qCritical("SampleSinkFifo::read: underflow - missing %u samples", count - total);
emit underflow(count - total);
} }
remaining = total; remaining = total;
@ -254,8 +294,10 @@ unsigned int SampleSinkFifo::readBegin(unsigned int count,
total = std::min(count, m_fill); total = std::min(count, m_fill);
if (total < count) { if (total < count)
{
qCritical("SampleSinkFifo::readBegin: underflow - missing %u samples", count - total); qCritical("SampleSinkFifo::readBegin: underflow - missing %u samples", count - total);
emit underflow(count - total);
} }
remaining = total; remaining = total;

View File

@ -32,6 +32,9 @@ private:
QElapsedTimer m_msgRateTimer; QElapsedTimer m_msgRateTimer;
int m_suppressed; int m_suppressed;
SampleVector m_data; SampleVector m_data;
int m_total;
unsigned int m_writtenSignalCount;
unsigned int m_writtenSignalRateDivider;
QMutex m_mutex; QMutex m_mutex;
unsigned int m_size; unsigned int m_size;
@ -49,6 +52,7 @@ public:
bool setSize(int size); bool setSize(int size);
void reset(); 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 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; } inline unsigned int fill() { QMutexLocker mutexLocker(&m_mutex); unsigned int fill = m_fill; return fill; }
@ -65,6 +69,9 @@ public:
signals: signals:
void dataReady(); void dataReady();
void written(int nsamples, qint64 timestamp);
void overflow(int nsamples);
void underflow(int nsamples);
}; };
#endif // INCLUDE_SAMPLEFIFO_H #endif // INCLUDE_SAMPLEFIFO_H

View File

@ -62,6 +62,8 @@ MainCore::MainCore()
{ {
m_masterTimer.setTimerType(Qt::PreciseTimer); m_masterTimer.setTimerType(Qt::PreciseTimer);
m_masterTimer.start(50); m_masterTimer.start(50);
m_startMsecsSinceEpoch = QDateTime::currentMSecsSinceEpoch();
m_masterElapsedTimer.start();
} }
MainCore::~MainCore() MainCore::~MainCore()

View File

@ -22,6 +22,7 @@
#include <QMap> #include <QMap>
#include <QTimer> #include <QTimer>
#include <QElapsedTimer>
#include <QDateTime> #include <QDateTime>
#include <QObject> #include <QObject>
@ -706,6 +707,8 @@ public:
static MainCore *instance(); static MainCore *instance();
const QTimer& getMasterTimer() const { return m_masterTimer; } 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; } const MainSettings& getSettings() const { return m_settings; }
MessageQueue *getMainMessageQueue() { return m_mainMessageQueue; } MessageQueue *getMainMessageQueue() { return m_mainMessageQueue; }
const PluginManager *getPluginManager() const { return m_pluginManager; } const PluginManager *getPluginManager() const { return m_pluginManager; }
@ -760,6 +763,8 @@ private:
MessageQueue *m_mainMessageQueue; MessageQueue *m_mainMessageQueue;
int m_masterTabIndex; int m_masterTabIndex;
QTimer m_masterTimer; QTimer m_masterTimer;
QElapsedTimer m_masterElapsedTimer;
qint64 m_startMsecsSinceEpoch;
std::vector<DeviceSet*> m_deviceSets; std::vector<DeviceSet*> m_deviceSets;
std::vector<FeatureSet*> m_featureSets; std::vector<FeatureSet*> m_featureSets;
QMap<DeviceSet*, int> m_deviceSetsMap; //!< Device set instance to device set index map QMap<DeviceSet*, int> m_deviceSetsMap; //!< Device set instance to device set index map