mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-04-10 13:40:37 -04:00
Modulators: changed single Tx channel samples feed handling
This commit is contained in:
parent
d59bf85afb
commit
1afd8df5f9
plugins
channeltx
samplesink/filesink
sdrbase/dsp
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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];
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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
|
||||
|
@ -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()));
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user