mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-16 13:21:50 -05:00
SDRdaemon: channel source data read queue: scale max length to sample rate
This commit is contained in:
parent
5013e77f24
commit
c7bcfaead1
@ -265,8 +265,10 @@ void SDRDaemonChannelSource::handleDataBlock(SDRDaemonDataBlock* dataBlock)
|
|||||||
m_deviceAPI->getSampleSink()->setCenterFrequency(metaData->m_centerFrequency);
|
m_deviceAPI->getSampleSink()->setCenterFrequency(metaData->m_centerFrequency);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_currentMeta.m_sampleRate != metaData->m_sampleRate) {
|
if (m_currentMeta.m_sampleRate != metaData->m_sampleRate)
|
||||||
|
{
|
||||||
m_channelizer->configure(m_channelizer->getInputMessageQueue(), metaData->m_sampleRate, 0);
|
m_channelizer->configure(m_channelizer->getInputMessageQueue(), metaData->m_sampleRate, 0);
|
||||||
|
m_dataReadQueue.setSize(calculateDataReadQueueSize(metaData->m_sampleRate));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,3 +306,12 @@ void SDRDaemonChannelSource::printMeta(const QString& header, SDRDaemonMetaDataF
|
|||||||
<< ":" << metaData->m_tv_usec
|
<< ":" << metaData->m_tv_usec
|
||||||
<< "|";
|
<< "|";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t SDRDaemonChannelSource::calculateDataReadQueueSize(int sampleRate)
|
||||||
|
{
|
||||||
|
// scale for 20 blocks at 48 kS/s. Take next even number.
|
||||||
|
uint32_t maxSize = sampleRate / 2400;
|
||||||
|
maxSize = (maxSize % 2 == 0) ? maxSize : maxSize + 1;
|
||||||
|
qDebug("SDRDaemonChannelSource::calculateDataReadQueueSize: set max queue size to %u blocks", maxSize);
|
||||||
|
return maxSize;
|
||||||
|
}
|
||||||
|
@ -106,6 +106,7 @@ private:
|
|||||||
void applySettings(const SDRDaemonChannelSourceSettings& settings, bool force = false);
|
void applySettings(const SDRDaemonChannelSourceSettings& settings, bool force = false);
|
||||||
void handleDataBlock(SDRDaemonDataBlock *dataBlock);
|
void handleDataBlock(SDRDaemonDataBlock *dataBlock);
|
||||||
void printMeta(const QString& header, SDRDaemonMetaDataFEC *metaData);
|
void printMeta(const QString& header, SDRDaemonMetaDataFEC *metaData);
|
||||||
|
uint32_t calculateDataReadQueueSize(int sampleRate);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void handleData();
|
void handleData();
|
||||||
|
@ -23,10 +23,11 @@
|
|||||||
#include "channel/sdrdaemondatablock.h"
|
#include "channel/sdrdaemondatablock.h"
|
||||||
#include "channel/sdrdaemondatareadqueue.h"
|
#include "channel/sdrdaemondatareadqueue.h"
|
||||||
|
|
||||||
const uint32_t SDRDaemonDataReadQueue::MaxSize = 20;
|
const uint32_t SDRDaemonDataReadQueue::MinimumMaxSize = 10;
|
||||||
|
|
||||||
SDRDaemonDataReadQueue::SDRDaemonDataReadQueue() :
|
SDRDaemonDataReadQueue::SDRDaemonDataReadQueue() :
|
||||||
m_dataBlock(0),
|
m_dataBlock(0),
|
||||||
|
m_maxSize(MinimumMaxSize),
|
||||||
m_blockIndex(1),
|
m_blockIndex(1),
|
||||||
m_sampleIndex(0),
|
m_sampleIndex(0),
|
||||||
m_full(false)
|
m_full(false)
|
||||||
@ -45,7 +46,7 @@ SDRDaemonDataReadQueue::~SDRDaemonDataReadQueue()
|
|||||||
|
|
||||||
void SDRDaemonDataReadQueue::push(SDRDaemonDataBlock* dataBlock)
|
void SDRDaemonDataReadQueue::push(SDRDaemonDataBlock* dataBlock)
|
||||||
{
|
{
|
||||||
if (size() >= MaxSize)
|
if (size() >= m_maxSize)
|
||||||
{
|
{
|
||||||
qWarning("SDRDaemonDataReadQueue::push: queue is full");
|
qWarning("SDRDaemonDataReadQueue::push: queue is full");
|
||||||
m_full = true; // stop filling the queue
|
m_full = true; // stop filling the queue
|
||||||
@ -54,7 +55,7 @@ void SDRDaemonDataReadQueue::push(SDRDaemonDataBlock* dataBlock)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_full) {
|
if (m_full) {
|
||||||
m_full = (size() > MaxSize/2); // do not fill queue again before queue is half size
|
m_full = (size() > m_maxSize/2); // do not fill queue again before queue is half size
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_full) {
|
if (!m_full) {
|
||||||
@ -77,17 +78,24 @@ SDRDaemonDataBlock* SDRDaemonDataReadQueue::pop()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t SDRDaemonDataReadQueue::size()
|
uint32_t SDRDaemonDataReadQueue::size() const
|
||||||
{
|
{
|
||||||
return m_dataReadQueue.size();
|
return m_dataReadQueue.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SDRDaemonDataReadQueue::setSize(uint32_t size)
|
||||||
|
{
|
||||||
|
if (size != m_maxSize) {
|
||||||
|
m_maxSize = size < MinimumMaxSize ? MinimumMaxSize : size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SDRDaemonDataReadQueue::readSample(Sample& s)
|
void SDRDaemonDataReadQueue::readSample(Sample& s)
|
||||||
{
|
{
|
||||||
// depletion/repletion state
|
// depletion/repletion state
|
||||||
if (m_dataBlock == 0)
|
if (m_dataBlock == 0)
|
||||||
{
|
{
|
||||||
if (size() >= MaxSize/2)
|
if (size() >= m_maxSize/2)
|
||||||
{
|
{
|
||||||
qDebug("SDRDaemonDataReadQueue::readSample: initial pop new block: queue size: %u", size());
|
qDebug("SDRDaemonDataReadQueue::readSample: initial pop new block: queue size: %u", size());
|
||||||
m_blockIndex = 1;
|
m_blockIndex = 1;
|
||||||
|
@ -37,13 +37,15 @@ public:
|
|||||||
void push(SDRDaemonDataBlock* dataBlock); //!< push block on the queue
|
void push(SDRDaemonDataBlock* dataBlock); //!< push block on the queue
|
||||||
SDRDaemonDataBlock* pop(); //!< Pop block from the queue
|
SDRDaemonDataBlock* pop(); //!< Pop block from the queue
|
||||||
void readSample(Sample& s); //!< Read sample from queue
|
void readSample(Sample& s); //!< Read sample from queue
|
||||||
uint32_t size(); //!< Returns queue size
|
uint32_t size() const; //!< Returns queue size
|
||||||
|
void setSize(uint32_t size); //!< Sets the queue size
|
||||||
|
|
||||||
static const uint32_t MaxSize;
|
static const uint32_t MinimumMaxSize;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QQueue<SDRDaemonDataBlock*> m_dataReadQueue;
|
QQueue<SDRDaemonDataBlock*> m_dataReadQueue;
|
||||||
SDRDaemonDataBlock *m_dataBlock;
|
SDRDaemonDataBlock *m_dataBlock;
|
||||||
|
uint32_t m_maxSize;
|
||||||
uint32_t m_blockIndex;
|
uint32_t m_blockIndex;
|
||||||
uint32_t m_sampleIndex;
|
uint32_t m_sampleIndex;
|
||||||
bool m_full; //!< full condition was hit
|
bool m_full; //!< full condition was hit
|
||||||
|
Loading…
Reference in New Issue
Block a user