1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-29 19:28:47 -05:00

Tx support: single channel: make FIFO read and writes truly independent (unoptimized)

This commit is contained in:
f4exb 2018-01-02 01:33:09 +01:00
parent b731ff851a
commit 420ef78ad5
4 changed files with 42 additions and 8 deletions

View File

@ -20,7 +20,8 @@
BasebandSampleSource::BasebandSampleSource() : BasebandSampleSource::BasebandSampleSource() :
m_guiMessageQueue(0), m_guiMessageQueue(0),
m_sampleFifo(48000) // arbitrary, will be adjusted to match device sink FIFO size m_sampleFifo(48000), // arbitrary, will be adjusted to match device sink FIFO size
m_deviceSampleFifo(0)
{ {
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
connect(&m_sampleFifo, SIGNAL(dataWrite(int)), this, SLOT(handleWriteToFifo(int))); connect(&m_sampleFifo, SIGNAL(dataWrite(int)), this, SLOT(handleWriteToFifo(int)));
@ -44,16 +45,41 @@ void BasebandSampleSource::handleInputMessages()
} }
void BasebandSampleSource::handleWriteToFifo(int nbSamples) void BasebandSampleSource::handleWriteToFifo(int nbSamples)
{
handleWriteToFifo(&m_sampleFifo, nbSamples);
}
void BasebandSampleSource::handleWriteToDeviceFifo(int nbSamples)
{
handleWriteToFifo(m_deviceSampleFifo, nbSamples);
}
void BasebandSampleSource::handleWriteToFifo(SampleSourceFifo *sampleFifo, int nbSamples)
{ {
SampleVector::iterator writeAt; SampleVector::iterator writeAt;
m_sampleFifo.getWriteIterator(writeAt); sampleFifo->getWriteIterator(writeAt);
pullAudio(nbSamples); // Pre-fetch input audio samples this is mandatory to keep things running smoothly pullAudio(nbSamples); // Pre-fetch input audio samples this is mandatory to keep things running smoothly
for (int i = 0; i < nbSamples; i++) for (int i = 0; i < nbSamples; i++)
{ {
pull((*writeAt)); pull((*writeAt));
m_sampleFifo.bumpIndex(writeAt); sampleFifo->bumpIndex(writeAt);
} }
} }
void BasebandSampleSource::setDeviceSampleSourceFifo(SampleSourceFifo *deviceSampleFifo)
{
if (m_deviceSampleFifo != deviceSampleFifo)
{
if (m_deviceSampleFifo) {
disconnect(m_deviceSampleFifo, SIGNAL(dataWrite(int)), this, SLOT(handleWriteToDeviceFifo(int)));
}
if (deviceSampleFifo) {
connect(deviceSampleFifo, SIGNAL(dataWrite(int)), this, SLOT(handleWriteToDeviceFifo(int)));
}
m_deviceSampleFifo = deviceSampleFifo;
}
}

View File

@ -58,15 +58,20 @@ public:
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; } virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; } MessageQueue *getMessageQueueToGUI() { return m_guiMessageQueue; }
void setDeviceSampleSourceFifo(SampleSourceFifo *deviceSampleFifo);
protected: protected:
MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication
MessageQueue *m_guiMessageQueue; //!< Input message queue to the GUI MessageQueue *m_guiMessageQueue; //!< Input message queue to the GUI
SampleSourceFifo m_sampleFifo; //!< Internal FIFO for multi-channel processing SampleSourceFifo m_sampleFifo; //!< Internal FIFO for multi-channel processing
SampleSourceFifo *m_deviceSampleFifo; //!< Reference to the device FIFO for single channel processing
void handleWriteToFifo(SampleSourceFifo *sampleFifo, int nbSamples);
protected slots: protected slots:
void handleInputMessages(); void handleInputMessages();
void handleWriteToFifo(int nbSamples); void handleWriteToFifo(int nbSamples);
void handleWriteToDeviceFifo(int nbSamples);
}; };
#endif /* SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_ */ #endif /* SDRBASE_DSP_BASEBANDSAMPLESOURCE_H_ */

View File

@ -179,9 +179,9 @@ void DSPDeviceSinkEngine::work(int nbWriteSamples)
{ {
// qDebug("DSPDeviceSinkEngine::work: single channel source handling"); // qDebug("DSPDeviceSinkEngine::work: single channel source handling");
if (m_threadedBasebandSampleSources.size() == 1) { if (m_threadedBasebandSampleSources.size() == 1) {
m_threadedBasebandSampleSources.back()->feed(sampleFifo, nbWriteSamples); m_threadedBasebandSampleSources.back()->setDeviceSampleSourceFifo(sampleFifo);
} else if (m_basebandSampleSources.size() == 1) { } else if (m_basebandSampleSources.size() == 1) {
m_basebandSampleSources.back()->feed(sampleFifo, nbWriteSamples); m_threadedBasebandSampleSources.back()->setDeviceSampleSourceFifo(sampleFifo);
} }
} }
// multiple channel sources handling // multiple channel sources handling
@ -257,11 +257,13 @@ void DSPDeviceSinkEngine::work(int nbWriteSamples)
for (ThreadedBasebandSampleSources::iterator it = m_threadedBasebandSampleSources.begin(); it != m_threadedBasebandSampleSources.end(); ++it) for (ThreadedBasebandSampleSources::iterator it = m_threadedBasebandSampleSources.begin(); it != m_threadedBasebandSampleSources.end(); ++it)
{ {
(*it)->setDeviceSampleSourceFifo(0);
(*it)->pullAudio(nbWriteSamples); (*it)->pullAudio(nbWriteSamples);
} }
for (BasebandSampleSources::iterator it = m_basebandSampleSources.begin(); it != m_basebandSampleSources.end(); ++it) for (BasebandSampleSources::iterator it = m_basebandSampleSources.begin(); it != m_basebandSampleSources.end(); ++it)
{ {
(*it)->setDeviceSampleSourceFifo(0);
(*it)->pullAudio(nbWriteSamples); (*it)->pullAudio(nbWriteSamples);
} }

View File

@ -51,6 +51,7 @@ public:
int nbSamples); int nbSamples);
SampleSourceFifo& getSampleSourceFifo() { return m_basebandSampleSource->getSampleSourceFifo(); } SampleSourceFifo& getSampleSourceFifo() { return m_basebandSampleSource->getSampleSourceFifo(); }
void setDeviceSampleSourceFifo(SampleSourceFifo *deviceSampleFifo) { m_basebandSampleSource->setDeviceSampleSourceFifo(deviceSampleFifo); }
QString getSampleSourceObjectName() const; QString getSampleSourceObjectName() const;