diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.cpp b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.cpp index 87fd82b6b..ee955d7e9 100644 --- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.cpp +++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecbuffer.cpp @@ -39,6 +39,7 @@ SDRdaemonFECBuffer::SDRdaemonFECBuffer(uint32_t throttlems) : m_bufferLenSec(0.0f) { m_currentMeta.init(); + m_outputMeta.init(); m_framesNbBytes = nbDecoderSlots * sizeof(BufferFrame) * m_iqSampleSize; m_wrDeltaEstimate = m_framesNbBytes / 2; } @@ -82,6 +83,13 @@ void SDRdaemonFECBuffer::initDecodeSlot(int slotIndex) { int pseudoWriteIndex = slotIndex * sizeof(BufferFrame); m_wrDeltaEstimate = pseudoWriteIndex - m_readIndex; + + if (m_decoderSlots[slotIndex].m_blockZero.m_metaData.m_nbFECBlocks < 0) { // meta data invalid + m_outputMeta = m_currentMeta; // use current meta + } else { + m_outputMeta = m_decoderSlots[slotIndex].m_blockZero.m_metaData; + } + // collect stats before voiding the slot m_curNbBlocks = m_decoderSlots[slotIndex].m_blockCount; m_curNbRecovery = m_decoderSlots[slotIndex].m_recoveryCount; @@ -205,6 +213,10 @@ void SDRdaemonFECBuffer::writeData(char *array, uint32_t length) { int nbOriginalBlocks = m_decoderSlots[decoderIndex].m_blockCount - m_decoderSlots[decoderIndex].m_recoveryCount; + qDebug() << "SDRdaemonFECBuffer::writeData:" + << " nbOriginalBlocks: " << nbOriginalBlocks + << " m_recoveryCount: " << m_decoderSlots[decoderIndex].m_recoveryCount; + for (int ir = 0; ir < m_decoderSlots[decoderIndex].m_recoveryCount; ir++) // recover lost blocks { int blockIndex = m_decoderSlots[decoderIndex].m_cm256DescriptorBlocks[nbOriginalBlocks+ir].Index; @@ -225,6 +237,8 @@ void SDRdaemonFECBuffer::writeData(char *array, uint32_t length) } } + //printMeta("SDRdaemonFECBuffer::writeData", &m_decoderSlots[decoderIndex].m_blockZero.m_metaData); + if (m_decoderSlots[decoderIndex].m_blockZero.m_metaData.m_nbFECBlocks >= 0) // meta data valid { if (!(m_decoderSlots[decoderIndex].m_blockZero.m_metaData == m_currentMeta)) diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecudphandler.cpp b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecudphandler.cpp index ae763c08a..28320d48d 100644 --- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecudphandler.cpp +++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecudphandler.cpp @@ -67,7 +67,7 @@ SDRdaemonFECUDPHandler::~SDRdaemonFECUDPHandler() void SDRdaemonFECUDPHandler::start() { - qDebug("SDRdaemonUDPHandler::start"); + qDebug("SDRdaemonFECUDPHandler::start"); if (!m_dataSocket) { @@ -78,13 +78,13 @@ void SDRdaemonFECUDPHandler::start() { if (m_dataSocket->bind(m_dataAddress, m_dataPort)) { - qDebug("SDRdaemonUDPHandler::start: bind data socket to %s:%d", m_dataAddress.toString().toStdString().c_str(), m_dataPort); + qDebug("SDRdaemonFECUDPHandler::start: bind data socket to %s:%d", m_dataAddress.toString().toStdString().c_str(), m_dataPort); connect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead()), Qt::QueuedConnection); // , Qt::QueuedConnection m_dataConnected = true; } else { - qWarning("SDRdaemonUDPHandler::start: cannot bind data port %d", m_dataPort); + qWarning("SDRdaemonFECUDPHandler::start: cannot bind data port %d", m_dataPort); m_dataConnected = false; } } @@ -97,7 +97,7 @@ void SDRdaemonFECUDPHandler::start() void SDRdaemonFECUDPHandler::stop() { - qDebug("SDRdaemonUDPHandler::stop"); + qDebug("SDRdaemonFECUDPHandler::stop"); if (m_dataConnected) { disconnect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); @@ -113,12 +113,12 @@ void SDRdaemonFECUDPHandler::stop() void SDRdaemonFECUDPHandler::configureUDPLink(const QString& address, quint16 port) { - qDebug("SDRdaemonUDPHandler::configureUDPLink: %s:%d", address.toStdString().c_str(), port); + qDebug("SDRdaemonFECUDPHandler::configureUDPLink: %s:%d", address.toStdString().c_str(), port); bool addressOK = m_dataAddress.setAddress(address); if (!addressOK) { - qWarning("SDRdaemonUDPHandler::configureUDPLink: invalid address %s. Set to localhost.", address.toStdString().c_str()); + qWarning("SDRdaemonFECUDPHandler::configureUDPLink: invalid address %s. Set to localhost.", address.toStdString().c_str()); m_dataAddress = QHostAddress::LocalHost; } @@ -134,9 +134,6 @@ void SDRdaemonFECUDPHandler::dataReadyRead() qint64 pendingDataSize = m_dataSocket->pendingDatagramSize(); m_udpReadBytes = m_dataSocket->readDatagram(m_udpBuf, pendingDataSize, &m_remoteAddress, 0); - qDebug() << "SDRdaemonUDPHandler::dataReadyRead:" - << " m_udpReadBytes: " << m_udpReadBytes; - if (m_udpReadBytes == SDRdaemonFECBuffer::m_udpPayloadSize) { processData(); } @@ -152,10 +149,6 @@ void SDRdaemonFECUDPHandler::processData() m_tv_sec = metaData.m_tv_sec; m_tv_usec = metaData.m_tv_usec; - qDebug() << "SDRdaemonUDPHandler::processData:" - << " m_samplerate: " << metaData.m_sampleRate - << " m_centerFrequency: " << metaData.m_centerFrequency; - if (m_centerFrequency != metaData.m_centerFrequency) { m_centerFrequency = metaData.m_centerFrequency; @@ -183,7 +176,7 @@ void SDRdaemonFECUDPHandler::processData() void SDRdaemonFECUDPHandler::connectTimer(const QTimer* timer) { - qDebug() << "SDRdaemonUDPHandler::connectTimer"; + qDebug() << "SDRdaemonFECUDPHandler::connectTimer"; #ifdef USE_INTERNAL_TIMER #warning "Uses internal timer" m_timer = new QTimer(); @@ -226,7 +219,7 @@ void SDRdaemonFECUDPHandler::tick() m_tv_usec, m_sdrDaemonBuffer.getBufferLengthInSecs(), m_sdrDaemonBuffer.getBufferGauge(), - m_sdrDaemonBuffer.getCurNbBlocks() == SDRdaemonFECBuffer::m_nbOriginalBlocks, + SDRdaemonFECBuffer::m_nbOriginalBlocks, m_sdrDaemonBuffer.getCurNbBlocks(), m_sdrDaemonBuffer.getCurNbRecovery(), m_sdrDaemonBuffer.getAvgNbBlocks(),