mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -05: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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user