mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-08-25 08:52:26 -04:00
Modulators: changed single Tx channel samples feed handling
This commit is contained in:
parent
d59bf85afb
commit
1afd8df5f9
@ -136,6 +136,19 @@ void AMMod::pull(Sample& sample)
|
|||||||
sample.m_imag = (FixReal) ci.imag();
|
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()
|
void AMMod::modulateSample()
|
||||||
{
|
{
|
||||||
Real t;
|
Real t;
|
||||||
|
@ -185,6 +185,11 @@ public:
|
|||||||
bool playLoop);
|
bool playLoop);
|
||||||
|
|
||||||
virtual void pull(Sample& sample);
|
virtual void pull(Sample& sample);
|
||||||
|
|
||||||
|
/** direct feeding of sample source FIFO */
|
||||||
|
virtual void feed(SampleSourceFifo* sampleFifo,
|
||||||
|
int nbSamples);
|
||||||
|
|
||||||
virtual void start();
|
virtual void start();
|
||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
@ -151,6 +151,19 @@ void NFMMod::pull(Sample& sample)
|
|||||||
sample.m_imag = (FixReal) ci.imag();
|
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()
|
void NFMMod::modulateSample()
|
||||||
{
|
{
|
||||||
Real t;
|
Real t;
|
||||||
|
@ -190,6 +190,11 @@ public:
|
|||||||
float ctcssFrequency);
|
float ctcssFrequency);
|
||||||
|
|
||||||
virtual void pull(Sample& sample);
|
virtual void pull(Sample& sample);
|
||||||
|
|
||||||
|
/** direct feeding of sample source FIFO */
|
||||||
|
virtual void feed(SampleSourceFifo* sampleFifo,
|
||||||
|
int nbSamples);
|
||||||
|
|
||||||
virtual void start();
|
virtual void start();
|
||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
@ -182,6 +182,19 @@ void SSBMod::pull(Sample& sample)
|
|||||||
sample.m_imag = (FixReal) ci.imag();
|
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()
|
void SSBMod::modulateSample()
|
||||||
{
|
{
|
||||||
pullAF(m_modSample);
|
pullAF(m_modSample);
|
||||||
|
@ -190,6 +190,11 @@ public:
|
|||||||
bool playLoop);
|
bool playLoop);
|
||||||
|
|
||||||
virtual void pull(Sample& sample);
|
virtual void pull(Sample& sample);
|
||||||
|
|
||||||
|
/** direct feeding of sample source FIFO */
|
||||||
|
virtual void feed(SampleSourceFifo* sampleFifo,
|
||||||
|
int nbSamples);
|
||||||
|
|
||||||
virtual void start();
|
virtual void start();
|
||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
@ -139,6 +139,19 @@ void WFMMod::pull(Sample& sample)
|
|||||||
sample.m_imag = (FixReal) ci.imag();
|
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)
|
void WFMMod::pullAF(Complex& sample)
|
||||||
{
|
{
|
||||||
int16_t audioSample[2];
|
int16_t audioSample[2];
|
||||||
|
@ -187,6 +187,11 @@ public:
|
|||||||
bool playLoop);
|
bool playLoop);
|
||||||
|
|
||||||
virtual void pull(Sample& sample);
|
virtual void pull(Sample& sample);
|
||||||
|
|
||||||
|
/** direct feeding of sample source FIFO */
|
||||||
|
virtual void feed(SampleSourceFifo* sampleFifo,
|
||||||
|
int nbSamples);
|
||||||
|
|
||||||
virtual void start();
|
virtual void start();
|
||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
@ -128,11 +128,11 @@ void FileSinkThread::tick()
|
|||||||
m_throttleToggle = !m_throttleToggle;
|
m_throttleToggle = !m_throttleToggle;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_throttlems > m_maxThrottlems)
|
// if (m_throttlems > m_maxThrottlems)
|
||||||
{
|
// {
|
||||||
qDebug("FileSinkThread::tick: m_maxThrottlems: %d", m_maxThrottlems);
|
// qDebug("FileSinkThread::tick: m_maxThrottlems: %d", m_maxThrottlems);
|
||||||
m_maxThrottlems = m_throttlems;
|
// m_maxThrottlems = m_throttlems;
|
||||||
}
|
// }
|
||||||
|
|
||||||
SampleVector::iterator readUntil;
|
SampleVector::iterator readUntil;
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#define INCLUDE_SAMPLESINK_H
|
#define INCLUDE_SAMPLESINK_H
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include "dsptypes.h"
|
#include "dsp/dsptypes.h"
|
||||||
#include "util/export.h"
|
#include "util/export.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
|
@ -19,7 +19,8 @@
|
|||||||
#define SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_
|
#define SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include "dsptypes.h"
|
#include "dsp/dsptypes.h"
|
||||||
|
#include "dsp/samplesourcefifo.h"
|
||||||
#include "util/export.h"
|
#include "util/export.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
|
|
||||||
@ -34,6 +35,11 @@ public:
|
|||||||
virtual void start() = 0;
|
virtual void start() = 0;
|
||||||
virtual void stop() = 0;
|
virtual void stop() = 0;
|
||||||
virtual void pull(Sample& sample) = 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
|
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
|
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#include "dsp/devicesamplesink.h"
|
#include "dsp/devicesamplesink.h"
|
||||||
|
|
||||||
DeviceSampleSink::DeviceSampleSink() :
|
DeviceSampleSink::DeviceSampleSink() :
|
||||||
m_sampleSourceFifo(1<<19, 1<<17)
|
m_sampleSourceFifo(1<<19)
|
||||||
{
|
{
|
||||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||||
}
|
}
|
||||||
|
@ -172,15 +172,29 @@ void DSPDeviceSinkEngine::work(int nbWriteSamples)
|
|||||||
{
|
{
|
||||||
SampleSourceFifo* sampleFifo = m_deviceSampleSink->getSampleFifo();
|
SampleSourceFifo* sampleFifo = m_deviceSampleSink->getSampleFifo();
|
||||||
//unsigned int nbWriteSamples = sampleFifo->getChunkSize();
|
//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
|
// 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)
|
for (ThreadedBasebandSampleSources::iterator it = m_threadedBasebandSampleSources.begin(); it != m_threadedBasebandSampleSources.end(); ++it)
|
||||||
|
@ -17,12 +17,10 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include "samplesourcefifo.h"
|
#include "samplesourcefifo.h"
|
||||||
|
|
||||||
SampleSourceFifo::SampleSourceFifo(uint32_t size, uint32_t samplesChunkSize) :
|
SampleSourceFifo::SampleSourceFifo(uint32_t size) :
|
||||||
m_size(size),
|
m_size(size),
|
||||||
m_samplesChunkSize(samplesChunkSize),
|
|
||||||
m_init(false)
|
m_init(false)
|
||||||
{
|
{
|
||||||
assert(samplesChunkSize <= m_size/4);
|
|
||||||
m_data.resize(2*m_size);
|
m_data.resize(2*m_size);
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
@ -37,7 +35,6 @@ void SampleSourceFifo::resize(uint32_t size, uint32_t samplesChunkSize)
|
|||||||
assert(samplesChunkSize <= size/4);
|
assert(samplesChunkSize <= size/4);
|
||||||
|
|
||||||
m_size = size;
|
m_size = size;
|
||||||
m_samplesChunkSize = samplesChunkSize;
|
|
||||||
m_data.resize(2*m_size);
|
m_data.resize(2*m_size);
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
@ -46,14 +43,14 @@ void SampleSourceFifo::init()
|
|||||||
{
|
{
|
||||||
memset(&m_data[0], 0, sizeof(2*m_size*sizeof(Sample)));
|
memset(&m_data[0], 0, sizeof(2*m_size*sizeof(Sample)));
|
||||||
m_ir = 0;
|
m_ir = 0;
|
||||||
m_iw = m_samplesChunkSize*2;
|
m_iw = m_size/2;
|
||||||
m_init = true;
|
m_init = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SampleSourceFifo::readAdvance(SampleVector::iterator& readUntil, unsigned int nbSamples)
|
void SampleSourceFifo::readAdvance(SampleVector::iterator& readUntil, unsigned int nbSamples)
|
||||||
{
|
{
|
||||||
// QMutexLocker mutexLocker(&m_mutex);
|
// QMutexLocker mutexLocker(&m_mutex);
|
||||||
assert(nbSamples < m_samplesChunkSize/2);
|
assert(nbSamples < m_size/4);
|
||||||
|
|
||||||
m_ir = (m_ir + nbSamples) % m_size;
|
m_ir = (m_ir + nbSamples) % m_size;
|
||||||
readUntil = m_data.begin() + m_size + m_ir;
|
readUntil = m_data.begin() + m_size + m_ir;
|
||||||
|
@ -28,11 +28,9 @@ class SDRANGEL_API SampleSourceFifo : public QObject {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SampleSourceFifo(uint32_t size, uint32_t samplesChunkSize);
|
SampleSourceFifo(uint32_t size);
|
||||||
~SampleSourceFifo();
|
~SampleSourceFifo();
|
||||||
|
|
||||||
unsigned int getChunkSize() const { return m_samplesChunkSize; }
|
|
||||||
|
|
||||||
void resize(uint32_t size, uint32_t samplesChunkSize);
|
void resize(uint32_t size, uint32_t samplesChunkSize);
|
||||||
void init();
|
void init();
|
||||||
/** advance read pointer for the given length and activate R/W signals */
|
/** advance read pointer for the given length and activate R/W signals */
|
||||||
@ -46,7 +44,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t m_size;
|
uint32_t m_size;
|
||||||
uint32_t m_samplesChunkSize;
|
|
||||||
SampleVector m_data;
|
SampleVector m_data;
|
||||||
uint32_t m_iw;
|
uint32_t m_iw;
|
||||||
uint32_t m_ir;
|
uint32_t m_ir;
|
||||||
|
@ -59,6 +59,12 @@ void ThreadedBasebandSampleSource::pull(Sample& sample)
|
|||||||
m_basebandSampleSource->pull(sample);
|
m_basebandSampleSource->pull(sample);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThreadedBasebandSampleSource::feed(SampleSourceFifo* sampleFifo,
|
||||||
|
int nbSamples)
|
||||||
|
{
|
||||||
|
m_basebandSampleSource->feed(sampleFifo, nbSamples);
|
||||||
|
}
|
||||||
|
|
||||||
bool ThreadedBasebandSampleSource::handleSourceMessage(const Message& cmd)
|
bool ThreadedBasebandSampleSource::handleSourceMessage(const Message& cmd)
|
||||||
{
|
{
|
||||||
return m_basebandSampleSource->handleMessage(cmd);
|
return m_basebandSampleSource->handleMessage(cmd);
|
||||||
|
@ -18,10 +18,9 @@
|
|||||||
#ifndef SDRBASE_DSP_THREADEDBASEBANDSAMPLESOURCE_H_
|
#ifndef SDRBASE_DSP_THREADEDBASEBANDSAMPLESOURCE_H_
|
||||||
#define SDRBASE_DSP_THREADEDBASEBANDSAMPLESOURCE_H_
|
#define SDRBASE_DSP_THREADEDBASEBANDSAMPLESOURCE_H_
|
||||||
|
|
||||||
#include <dsp/basebandsamplesource.h>
|
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
|
|
||||||
#include "samplesourcefifo.h"
|
#include "dsp/basebandsamplesource.h"
|
||||||
#include "util/messagequeue.h"
|
#include "util/messagequeue.h"
|
||||||
#include "util/export.h"
|
#include "util/export.h"
|
||||||
|
|
||||||
@ -48,6 +47,10 @@ public:
|
|||||||
bool handleSourceMessage(const Message& cmd); //!< Send message to source synchronously
|
bool handleSourceMessage(const Message& cmd); //!< Send message to source synchronously
|
||||||
void pull(Sample& sample); //!< Pull one sample from source
|
void pull(Sample& sample); //!< Pull one sample from source
|
||||||
|
|
||||||
|
/** direct feeding of sample source FIFO */
|
||||||
|
void feed(SampleSourceFifo* sampleFifo,
|
||||||
|
int nbSamples);
|
||||||
|
|
||||||
QString getSampleSourceObjectName() const;
|
QString getSampleSourceObjectName() const;
|
||||||
|
|
||||||
protected:
|
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()
|
void UpChannelizer::start()
|
||||||
{
|
{
|
||||||
if (m_sampleSource != 0)
|
if (m_sampleSource != 0)
|
||||||
|
@ -63,6 +63,11 @@ public:
|
|||||||
virtual void start();
|
virtual void start();
|
||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual void pull(Sample& sample);
|
virtual void pull(Sample& sample);
|
||||||
|
|
||||||
|
/** direct feeding of sample source FIFO */
|
||||||
|
virtual void feed(SampleSourceFifo* sampleFifo,
|
||||||
|
int nbSamples);
|
||||||
|
|
||||||
virtual bool handleMessage(const Message& cmd);
|
virtual bool handleMessage(const Message& cmd);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user