mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-26 02:20:26 -04: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