diff --git a/plugins/channeltx/modam/ammod.cpp b/plugins/channeltx/modam/ammod.cpp index de57a690f..371bb1b3c 100644 --- a/plugins/channeltx/modam/ammod.cpp +++ b/plugins/channeltx/modam/ammod.cpp @@ -136,6 +136,19 @@ void AMMod::pull(Sample& sample) sample.m_imag = (FixReal) ci.imag(); } +void AMMod::feed(SampleSourceFifo* sampleFifo, + int nbSamples) +{ + SampleVector::iterator writeAt; + sampleFifo->getWriteIterator(writeAt); + + for (int i = 0; i < nbSamples; i++) + { + pull((*writeAt)); + sampleFifo->bumpIndex(writeAt); + } +} + void AMMod::modulateSample() { Real t; diff --git a/plugins/channeltx/modam/ammod.h b/plugins/channeltx/modam/ammod.h index 0e16320f2..5a1b36d6f 100644 --- a/plugins/channeltx/modam/ammod.h +++ b/plugins/channeltx/modam/ammod.h @@ -185,6 +185,11 @@ public: bool playLoop); virtual void pull(Sample& sample); + + /** direct feeding of sample source FIFO */ + virtual void feed(SampleSourceFifo* sampleFifo, + int nbSamples); + virtual void start(); virtual void stop(); virtual bool handleMessage(const Message& cmd); diff --git a/plugins/channeltx/modnfm/nfmmod.cpp b/plugins/channeltx/modnfm/nfmmod.cpp index 64fda354e..3ff87ff3a 100644 --- a/plugins/channeltx/modnfm/nfmmod.cpp +++ b/plugins/channeltx/modnfm/nfmmod.cpp @@ -151,6 +151,19 @@ void NFMMod::pull(Sample& sample) sample.m_imag = (FixReal) ci.imag(); } +void NFMMod::feed(SampleSourceFifo* sampleFifo, + int nbSamples) +{ + SampleVector::iterator writeAt; + sampleFifo->getWriteIterator(writeAt); + + for (int i = 0; i < nbSamples; i++) + { + pull((*writeAt)); + sampleFifo->bumpIndex(writeAt); + } +} + void NFMMod::modulateSample() { Real t; diff --git a/plugins/channeltx/modnfm/nfmmod.h b/plugins/channeltx/modnfm/nfmmod.h index eb6e2978d..7916cc29a 100644 --- a/plugins/channeltx/modnfm/nfmmod.h +++ b/plugins/channeltx/modnfm/nfmmod.h @@ -190,6 +190,11 @@ public: float ctcssFrequency); virtual void pull(Sample& sample); + + /** direct feeding of sample source FIFO */ + virtual void feed(SampleSourceFifo* sampleFifo, + int nbSamples); + virtual void start(); virtual void stop(); virtual bool handleMessage(const Message& cmd); diff --git a/plugins/channeltx/modssb/ssbmod.cpp b/plugins/channeltx/modssb/ssbmod.cpp index 98ff21b6c..f6db984ba 100644 --- a/plugins/channeltx/modssb/ssbmod.cpp +++ b/plugins/channeltx/modssb/ssbmod.cpp @@ -182,6 +182,19 @@ void SSBMod::pull(Sample& sample) sample.m_imag = (FixReal) ci.imag(); } +void SSBMod::feed(SampleSourceFifo* sampleFifo, + int nbSamples) +{ + SampleVector::iterator writeAt; + sampleFifo->getWriteIterator(writeAt); + + for (int i = 0; i < nbSamples; i++) + { + pull((*writeAt)); + sampleFifo->bumpIndex(writeAt); + } +} + void SSBMod::modulateSample() { pullAF(m_modSample); diff --git a/plugins/channeltx/modssb/ssbmod.h b/plugins/channeltx/modssb/ssbmod.h index c420fceaa..f4d41f92f 100644 --- a/plugins/channeltx/modssb/ssbmod.h +++ b/plugins/channeltx/modssb/ssbmod.h @@ -190,6 +190,11 @@ public: bool playLoop); virtual void pull(Sample& sample); + + /** direct feeding of sample source FIFO */ + virtual void feed(SampleSourceFifo* sampleFifo, + int nbSamples); + virtual void start(); virtual void stop(); virtual bool handleMessage(const Message& cmd); diff --git a/plugins/channeltx/modwfm/wfmmod.cpp b/plugins/channeltx/modwfm/wfmmod.cpp index 2c296713c..8129e3d36 100644 --- a/plugins/channeltx/modwfm/wfmmod.cpp +++ b/plugins/channeltx/modwfm/wfmmod.cpp @@ -139,6 +139,19 @@ void WFMMod::pull(Sample& sample) sample.m_imag = (FixReal) ci.imag(); } +void WFMMod::feed(SampleSourceFifo* sampleFifo, + int nbSamples) +{ + SampleVector::iterator writeAt; + sampleFifo->getWriteIterator(writeAt); + + for (int i = 0; i < nbSamples; i++) + { + pull((*writeAt)); + sampleFifo->bumpIndex(writeAt); + } +} + void WFMMod::pullAF(Complex& sample) { int16_t audioSample[2]; diff --git a/plugins/channeltx/modwfm/wfmmod.h b/plugins/channeltx/modwfm/wfmmod.h index 0d7e2eb2c..83cd5491f 100644 --- a/plugins/channeltx/modwfm/wfmmod.h +++ b/plugins/channeltx/modwfm/wfmmod.h @@ -187,6 +187,11 @@ public: bool playLoop); virtual void pull(Sample& sample); + + /** direct feeding of sample source FIFO */ + virtual void feed(SampleSourceFifo* sampleFifo, + int nbSamples); + virtual void start(); virtual void stop(); virtual bool handleMessage(const Message& cmd); diff --git a/plugins/samplesink/filesink/filesinkthread.cpp b/plugins/samplesink/filesink/filesinkthread.cpp index ece134a87..98655de9c 100644 --- a/plugins/samplesink/filesink/filesinkthread.cpp +++ b/plugins/samplesink/filesink/filesinkthread.cpp @@ -128,11 +128,11 @@ void FileSinkThread::tick() m_throttleToggle = !m_throttleToggle; } - if (m_throttlems > m_maxThrottlems) - { - qDebug("FileSinkThread::tick: m_maxThrottlems: %d", m_maxThrottlems); - m_maxThrottlems = m_throttlems; - } +// if (m_throttlems > m_maxThrottlems) +// { +// qDebug("FileSinkThread::tick: m_maxThrottlems: %d", m_maxThrottlems); +// m_maxThrottlems = m_throttlems; +// } SampleVector::iterator readUntil; diff --git a/sdrbase/dsp/basebandsamplesink.h b/sdrbase/dsp/basebandsamplesink.h index 84ca781a3..adf47fe9e 100644 --- a/sdrbase/dsp/basebandsamplesink.h +++ b/sdrbase/dsp/basebandsamplesink.h @@ -19,7 +19,7 @@ #define INCLUDE_SAMPLESINK_H #include -#include "dsptypes.h" +#include "dsp/dsptypes.h" #include "util/export.h" #include "util/messagequeue.h" diff --git a/sdrbase/dsp/basebandsamplesource.h b/sdrbase/dsp/basebandsamplesource.h index 841697131..e78bd9890 100644 --- a/sdrbase/dsp/basebandsamplesource.h +++ b/sdrbase/dsp/basebandsamplesource.h @@ -19,7 +19,8 @@ #define SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_ #include -#include "dsptypes.h" +#include "dsp/dsptypes.h" +#include "dsp/samplesourcefifo.h" #include "util/export.h" #include "util/messagequeue.h" @@ -34,6 +35,11 @@ public: virtual void start() = 0; virtual void stop() = 0; virtual void pull(Sample& sample) = 0; + + /** direct feeding of sample source FIFO */ + virtual void feed(SampleSourceFifo* sampleFifo, + int nbSamples) = 0; + virtual bool handleMessage(const Message& cmd) = 0; //!< Processing of a message. Returns true if message has actually been processed MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication diff --git a/sdrbase/dsp/devicesamplesink.cpp b/sdrbase/dsp/devicesamplesink.cpp index b574c589d..bd76d6e5a 100644 --- a/sdrbase/dsp/devicesamplesink.cpp +++ b/sdrbase/dsp/devicesamplesink.cpp @@ -18,7 +18,7 @@ #include "dsp/devicesamplesink.h" DeviceSampleSink::DeviceSampleSink() : - m_sampleSourceFifo(1<<19, 1<<17) + m_sampleSourceFifo(1<<19) { connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); } diff --git a/sdrbase/dsp/dspdevicesinkengine.cpp b/sdrbase/dsp/dspdevicesinkengine.cpp index a5afbf317..2b8305370 100644 --- a/sdrbase/dsp/dspdevicesinkengine.cpp +++ b/sdrbase/dsp/dspdevicesinkengine.cpp @@ -172,15 +172,29 @@ void DSPDeviceSinkEngine::work(int nbWriteSamples) { SampleSourceFifo* sampleFifo = m_deviceSampleSink->getSampleFifo(); //unsigned int nbWriteSamples = sampleFifo->getChunkSize(); - SampleVector::iterator writeBegin; - sampleFifo->getWriteIterator(writeBegin); - SampleVector::iterator writeAt = writeBegin; - Sample s; - int sourceOccurence = 0; - if ((m_threadedBasebandSampleSources.size() + m_basebandSampleSources.size()) > 0) + // single channel source handling + if ((m_threadedBasebandSampleSources.size() + m_basebandSampleSources.size()) == 1) { - for (int is = 0; is < nbWriteSamples; is++) + for (ThreadedBasebandSampleSources::iterator it = m_threadedBasebandSampleSources.begin(); it != m_threadedBasebandSampleSources.end(); ++it) + { + (*it)->feed(sampleFifo, nbWriteSamples); + } + for (BasebandSampleSources::iterator it = m_basebandSampleSources.begin(); it != m_basebandSampleSources.end(); ++it) + { + (*it)->feed(sampleFifo, nbWriteSamples); + } + } + // multiple channel sources handling + else if ((m_threadedBasebandSampleSources.size() + m_basebandSampleSources.size()) > 1) + { + SampleVector::iterator writeBegin; + sampleFifo->getWriteIterator(writeBegin); + SampleVector::iterator writeAt = writeBegin; + Sample s; + int sourceOccurence = 0; + + for (int is = 0; is < nbWriteSamples; is++) { // pull data from threaded sources and merge them in the device sample FIFO for (ThreadedBasebandSampleSources::iterator it = m_threadedBasebandSampleSources.begin(); it != m_threadedBasebandSampleSources.end(); ++it) diff --git a/sdrbase/dsp/samplesourcefifo.cpp b/sdrbase/dsp/samplesourcefifo.cpp index 87d561b09..f09ad4f8d 100644 --- a/sdrbase/dsp/samplesourcefifo.cpp +++ b/sdrbase/dsp/samplesourcefifo.cpp @@ -17,12 +17,10 @@ #include #include "samplesourcefifo.h" -SampleSourceFifo::SampleSourceFifo(uint32_t size, uint32_t samplesChunkSize) : +SampleSourceFifo::SampleSourceFifo(uint32_t size) : m_size(size), - m_samplesChunkSize(samplesChunkSize), m_init(false) { - assert(samplesChunkSize <= m_size/4); m_data.resize(2*m_size); init(); } @@ -37,7 +35,6 @@ void SampleSourceFifo::resize(uint32_t size, uint32_t samplesChunkSize) assert(samplesChunkSize <= size/4); m_size = size; - m_samplesChunkSize = samplesChunkSize; m_data.resize(2*m_size); init(); } @@ -46,14 +43,14 @@ void SampleSourceFifo::init() { memset(&m_data[0], 0, sizeof(2*m_size*sizeof(Sample))); m_ir = 0; - m_iw = m_samplesChunkSize*2; + m_iw = m_size/2; m_init = true; } void SampleSourceFifo::readAdvance(SampleVector::iterator& readUntil, unsigned int nbSamples) { // QMutexLocker mutexLocker(&m_mutex); - assert(nbSamples < m_samplesChunkSize/2); + assert(nbSamples < m_size/4); m_ir = (m_ir + nbSamples) % m_size; readUntil = m_data.begin() + m_size + m_ir; diff --git a/sdrbase/dsp/samplesourcefifo.h b/sdrbase/dsp/samplesourcefifo.h index 601e56cc8..3767bf15d 100644 --- a/sdrbase/dsp/samplesourcefifo.h +++ b/sdrbase/dsp/samplesourcefifo.h @@ -28,11 +28,9 @@ class SDRANGEL_API SampleSourceFifo : public QObject { Q_OBJECT public: - SampleSourceFifo(uint32_t size, uint32_t samplesChunkSize); + SampleSourceFifo(uint32_t size); ~SampleSourceFifo(); - unsigned int getChunkSize() const { return m_samplesChunkSize; } - void resize(uint32_t size, uint32_t samplesChunkSize); void init(); /** advance read pointer for the given length and activate R/W signals */ @@ -46,7 +44,6 @@ public: private: uint32_t m_size; - uint32_t m_samplesChunkSize; SampleVector m_data; uint32_t m_iw; uint32_t m_ir; diff --git a/sdrbase/dsp/threadedbasebandsamplesource.cpp b/sdrbase/dsp/threadedbasebandsamplesource.cpp index bbd38bba8..57b8b125a 100644 --- a/sdrbase/dsp/threadedbasebandsamplesource.cpp +++ b/sdrbase/dsp/threadedbasebandsamplesource.cpp @@ -59,6 +59,12 @@ void ThreadedBasebandSampleSource::pull(Sample& sample) m_basebandSampleSource->pull(sample); } +void ThreadedBasebandSampleSource::feed(SampleSourceFifo* sampleFifo, + int nbSamples) +{ + m_basebandSampleSource->feed(sampleFifo, nbSamples); +} + bool ThreadedBasebandSampleSource::handleSourceMessage(const Message& cmd) { return m_basebandSampleSource->handleMessage(cmd); diff --git a/sdrbase/dsp/threadedbasebandsamplesource.h b/sdrbase/dsp/threadedbasebandsamplesource.h index 870132cc0..66c2bf67c 100644 --- a/sdrbase/dsp/threadedbasebandsamplesource.h +++ b/sdrbase/dsp/threadedbasebandsamplesource.h @@ -18,10 +18,9 @@ #ifndef SDRBASE_DSP_THREADEDBASEBANDSAMPLESOURCE_H_ #define SDRBASE_DSP_THREADEDBASEBANDSAMPLESOURCE_H_ -#include #include -#include "samplesourcefifo.h" +#include "dsp/basebandsamplesource.h" #include "util/messagequeue.h" #include "util/export.h" @@ -48,6 +47,10 @@ public: bool handleSourceMessage(const Message& cmd); //!< Send message to source synchronously void pull(Sample& sample); //!< Pull one sample from source + /** direct feeding of sample source FIFO */ + void feed(SampleSourceFifo* sampleFifo, + int nbSamples); + QString getSampleSourceObjectName() const; protected: diff --git a/sdrbase/dsp/upchannelizer.cpp b/sdrbase/dsp/upchannelizer.cpp index e31d55487..d15785943 100644 --- a/sdrbase/dsp/upchannelizer.cpp +++ b/sdrbase/dsp/upchannelizer.cpp @@ -102,6 +102,19 @@ void UpChannelizer::pull(Sample& sample) } } +void UpChannelizer::feed(SampleSourceFifo* sampleFifo, + int nbSamples) +{ + SampleVector::iterator writeAt; + sampleFifo->getWriteIterator(writeAt); + + for (int i = 0; i < nbSamples; i++) + { + pull((*writeAt)); + sampleFifo->bumpIndex(writeAt); + } +} + void UpChannelizer::start() { if (m_sampleSource != 0) diff --git a/sdrbase/dsp/upchannelizer.h b/sdrbase/dsp/upchannelizer.h index 66855b71a..8c801df1b 100644 --- a/sdrbase/dsp/upchannelizer.h +++ b/sdrbase/dsp/upchannelizer.h @@ -63,6 +63,11 @@ public: virtual void start(); virtual void stop(); virtual void pull(Sample& sample); + + /** direct feeding of sample source FIFO */ + virtual void feed(SampleSourceFifo* sampleFifo, + int nbSamples); + virtual bool handleMessage(const Message& cmd); protected: