Modulators: changed single Tx channel samples feed handling

This commit is contained in:
f4exb 2016-12-22 23:39:06 +01:00
parent d59bf85afb
commit 1afd8df5f9
19 changed files with 140 additions and 27 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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];

View File

@ -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);

View File

@ -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;

View File

@ -19,7 +19,7 @@
#define INCLUDE_SAMPLESINK_H
#include <QObject>
#include "dsptypes.h"
#include "dsp/dsptypes.h"
#include "util/export.h"
#include "util/messagequeue.h"

View File

@ -19,7 +19,8 @@
#define SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_
#include <QObject>
#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

View File

@ -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()));
}

View File

@ -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)

View File

@ -17,12 +17,10 @@
#include <assert.h>
#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;

View File

@ -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;

View File

@ -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);

View File

@ -18,10 +18,9 @@
#ifndef SDRBASE_DSP_THREADEDBASEBANDSAMPLESOURCE_H_
#define SDRBASE_DSP_THREADEDBASEBANDSAMPLESOURCE_H_
#include <dsp/basebandsamplesource.h>
#include <QMutex>
#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:

View File

@ -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)

View File

@ -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: