mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-04 05:30:32 -05:00 
			
		
		
		
	This commit is contained in:
		
							parent
							
								
									a1babc9706
								
							
						
					
					
						commit
						09599e145e
					
				@ -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)
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,7 @@
 | 
			
		||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
			
		||||
///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
#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;
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -62,6 +62,8 @@ MainCore::MainCore()
 | 
			
		||||
{
 | 
			
		||||
	m_masterTimer.setTimerType(Qt::PreciseTimer);
 | 
			
		||||
	m_masterTimer.start(50);
 | 
			
		||||
    m_startMsecsSinceEpoch = QDateTime::currentMSecsSinceEpoch();
 | 
			
		||||
    m_masterElapsedTimer.start();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MainCore::~MainCore()
 | 
			
		||||
 | 
			
		||||
@ -22,6 +22,7 @@
 | 
			
		||||
 | 
			
		||||
#include <QMap>
 | 
			
		||||
#include <QTimer>
 | 
			
		||||
#include <QElapsedTimer>
 | 
			
		||||
#include <QDateTime>
 | 
			
		||||
#include <QObject>
 | 
			
		||||
 | 
			
		||||
@ -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<DeviceSet*> m_deviceSets;
 | 
			
		||||
    std::vector<FeatureSet*> m_featureSets;
 | 
			
		||||
    QMap<DeviceSet*, int> m_deviceSetsMap;       //!< Device set instance to device set index map
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user