mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-06-25 05:25:27 -04:00
This commit is contained in:
parent
a1babc9706
commit
09599e145e
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user