From ae07fba86330fac2c7989cd13daa279e7477f54d Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 24 Aug 2019 04:54:07 +0200 Subject: [PATCH] Use a simplified version of sample FIFO (sample vector) in the threaded baseband sample sink --- sdrbase/CMakeLists.txt | 2 + sdrbase/dsp/samplesinkvector.cpp | 47 +++++++++++++++++++++ sdrbase/dsp/samplesinkvector.h | 48 ++++++++++++++++++++++ sdrbase/dsp/threadedbasebandsamplesink.cpp | 18 +++++++- sdrbase/dsp/threadedbasebandsamplesink.h | 3 ++ 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 sdrbase/dsp/samplesinkvector.cpp create mode 100644 sdrbase/dsp/samplesinkvector.h diff --git a/sdrbase/CMakeLists.txt b/sdrbase/CMakeLists.txt index c18993c1e..f82565a6a 100644 --- a/sdrbase/CMakeLists.txt +++ b/sdrbase/CMakeLists.txt @@ -97,6 +97,7 @@ set(sdrbase_SOURCES dsp/phaselockcomplex.cpp dsp/projector.cpp dsp/samplesinkfifo.cpp + dsp/samplesinkvector.cpp dsp/samplesourcefifo.cpp dsp/samplesinkfifodoublebuffered.cpp dsp/basebandsamplesink.cpp @@ -233,6 +234,7 @@ set(sdrbase_HEADERS dsp/projector.h dsp/recursivefilters.h dsp/samplesinkfifo.h + dsp/samplesinkvector.h dsp/samplesourcefifo.h dsp/samplesinkfifodoublebuffered.h dsp/samplesinkfifodecimator.h diff --git a/sdrbase/dsp/samplesinkvector.cpp b/sdrbase/dsp/samplesinkvector.cpp new file mode 100644 index 000000000..68808d921 --- /dev/null +++ b/sdrbase/dsp/samplesinkvector.cpp @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2019 Edouard Griffiths, F4EXB // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "samplesinkvector.h" + +SampleSinkVector::SampleSinkVector(QObject* parent) : + QObject(parent), + m_dataSize(0) +{} + +SampleSinkVector::~SampleSinkVector() +{} + +void SampleSinkVector::write(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end) +{ + if (end - begin > m_sampleVector.size()) { + m_sampleVector.resize(end - begin); + } + + std::copy(begin, end, m_sampleVector.begin()); + m_dataSize = end - begin; + // m_begin = begin; + // m_end = end; + emit dataReady(); +} + +void SampleSinkVector::read(SampleVector::const_iterator& begin, SampleVector::const_iterator& end) +{ + begin = m_sampleVector.begin(); + end = m_sampleVector.begin() + m_dataSize; + // begin = m_begin; + // end = m_end; +} \ No newline at end of file diff --git a/sdrbase/dsp/samplesinkvector.h b/sdrbase/dsp/samplesinkvector.h new file mode 100644 index 000000000..8eb008e52 --- /dev/null +++ b/sdrbase/dsp/samplesinkvector.h @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2019 Edouard Griffiths, F4EXB // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef SDRBASE_DSP_SAMPLESINKVECTOR_H_ +#define SDRBASE_DSP_SAMPLESINKVECTOR_H_ + +#include + +#include "dsp/dsptypes.h" +#include "export.h" + +class SDRBASE_API SampleSinkVector : public QObject { + Q_OBJECT + +public: + SampleSinkVector(QObject* parent = nullptr); + ~SampleSinkVector(); + + void write(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); + void read(SampleVector::const_iterator& begin, SampleVector::const_iterator& end); + +signals: + void dataReady(); + +private: + SampleVector m_sampleVector; + int m_dataSize; + int m_sampleVectorSize; + SampleVector::const_iterator m_begin; + SampleVector::const_iterator m_end; +}; + + +#endif // SDRBASE_DSP_SAMPLESINKVECTOR_H_ diff --git a/sdrbase/dsp/threadedbasebandsamplesink.cpp b/sdrbase/dsp/threadedbasebandsamplesink.cpp index cce47ec6a..809e6815b 100644 --- a/sdrbase/dsp/threadedbasebandsamplesink.cpp +++ b/sdrbase/dsp/threadedbasebandsamplesink.cpp @@ -8,7 +8,8 @@ ThreadedBasebandSampleSinkFifo::ThreadedBasebandSampleSinkFifo(BasebandSampleSink *sampleSink, std::size_t size) : m_sampleSink(sampleSink) { - connect(&m_sampleFifo, SIGNAL(dataReady()), this, SLOT(handleFifoData())); + //connect(&m_sampleFifo, SIGNAL(dataReady()), this, SLOT(handleFifoData())); + connect(&m_sampleVector, SIGNAL(dataReady()), this, SLOT(handleVectorData())); m_sampleFifo.setSize(size); } @@ -19,7 +20,20 @@ ThreadedBasebandSampleSinkFifo::~ThreadedBasebandSampleSinkFifo() void ThreadedBasebandSampleSinkFifo::writeToFifo(SampleVector::const_iterator& begin, SampleVector::const_iterator& end) { - m_sampleFifo.write(begin, end); + //m_sampleFifo.write(begin, end); + m_sampleVector.write(begin, end); +} + +void ThreadedBasebandSampleSinkFifo::handleVectorData() +{ + SampleVector::const_iterator vbegin; + SampleVector::const_iterator vend; + + if (m_sampleSink) + { + m_sampleVector.read(vbegin, vend); + m_sampleSink->feed(vbegin, vend, false); + } } void ThreadedBasebandSampleSinkFifo::handleFifoData() // FIXME: Fixed? Move it to the new threadable sink class diff --git a/sdrbase/dsp/threadedbasebandsamplesink.h b/sdrbase/dsp/threadedbasebandsamplesink.h index d398a0da0..6c4acf814 100644 --- a/sdrbase/dsp/threadedbasebandsamplesink.h +++ b/sdrbase/dsp/threadedbasebandsamplesink.h @@ -23,6 +23,7 @@ #include #include "samplesinkfifo.h" +#include "samplesinkvector.h" #include "util/messagequeue.h" #include "export.h" @@ -43,9 +44,11 @@ public: BasebandSampleSink* m_sampleSink; SampleSinkFifo m_sampleFifo; + SampleSinkVector m_sampleVector; public slots: void handleFifoData(); + void handleVectorData(); }; /**