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:
parent
b731ff851a
commit
420ef78ad5
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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_ */
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user