SDRDaemonSource: allow zero frequency and correct some calculations based on meta data

This commit is contained in:
f4exb 2018-09-13 14:58:35 +02:00
parent 0a2329ffe7
commit a07f01b021
3 changed files with 12 additions and 80 deletions

View File

@ -182,6 +182,7 @@ void SDRdaemonSourceBuffer::checkSlotData(int slotIndex)
if (!m_decoderSlots[slotIndex].m_decoded)
{
qDebug() << "SDRdaemonSourceBuffer::checkSlotData: incomplete frame:"
<< " slotIndex: " << slotIndex
<< " m_blockCount: " << m_decoderSlots[slotIndex].m_blockCount
<< " m_recoveryCount: " << m_decoderSlots[slotIndex].m_recoveryCount;
}
@ -258,12 +259,16 @@ void SDRdaemonSourceBuffer::writeData(char *array)
if (m_cm256.cm256_decode(m_paramsCM256, m_decoderSlots[decoderIndex].m_cm256DescriptorBlocks)) // CM256 decode
{
qDebug() << "SDRdaemonSourceBuffer::writeData: decode CM256 error:"
<< " decoderIndex: " << decoderIndex
<< " m_blockCount: " << m_decoderSlots[decoderIndex].m_blockCount
<< " m_originalCount: " << m_decoderSlots[decoderIndex].m_originalCount
<< " m_recoveryCount: " << m_decoderSlots[decoderIndex].m_recoveryCount;
}
else
{
qDebug() << "SDRdaemonSourceBuffer::writeData: decode CM256 success:"
<< " decoderIndex: " << decoderIndex
<< " m_blockCount: " << m_decoderSlots[decoderIndex].m_blockCount
<< " m_originalCount: " << m_decoderSlots[decoderIndex].m_originalCount
<< " m_recoveryCount: " << m_decoderSlots[decoderIndex].m_recoveryCount;
@ -296,7 +301,7 @@ void SDRdaemonSourceBuffer::writeData(char *array)
qDebug() << "SDRdaemonSourceBuffer::writeData: recovered block #" << blockIndex;
} // restore missing blocks
} // CM256 decode
} // revovery
} // recovery
if (m_decoderSlots[decoderIndex].m_metaRetrieved) // block zero with its meta data has been received
{
@ -304,12 +309,13 @@ void SDRdaemonSourceBuffer::writeData(char *array)
if (!(*metaData == m_currentMeta))
{
int sampleRate = metaData->m_sampleRate;
uint32_t sampleRate = metaData->m_sampleRate;
if (sampleRate > 0) {
m_bufferLenSec = (float) m_framesNbBytes / (float) (sampleRate * m_currentMeta.m_sampleBytes * 2);
if (sampleRate != 0)
{
m_bufferLenSec = (float) m_framesNbBytes / (float) (sampleRate * metaData->m_sampleBytes * 2);
m_balCorrLimit = sampleRate / 1000; // +/- 1 ms correction max per read
m_readNbBytes = (sampleRate * m_currentMeta.m_sampleBytes * 2) / 20;
m_readNbBytes = (sampleRate * metaData->m_sampleBytes * 2) / 20;
}
printMeta("SDRdaemonSourceBuffer::writeData: new meta", metaData); // print for change other than timestamp
@ -320,79 +326,6 @@ void SDRdaemonSourceBuffer::writeData(char *array)
} // decode
}
void SDRdaemonSourceBuffer::writeData0(char *array __attribute__((unused)), uint32_t length __attribute__((unused)))
{
// Kept as comments for the out of sync blocks algorithms
// assert(length == m_udpPayloadSize);
//
// bool dataAvailable = false;
// SuperBlock *superBlock = (SuperBlock *) array;
// int frameIndex = superBlock->header.frameIndex;
// int decoderIndex = frameIndex % nbDecoderSlots;
// int blockIndex = superBlock->header.blockIndex;
//
//// qDebug() << "SDRdaemonSourceBuffer::writeData:"
//// << " frameIndex: " << frameIndex
//// << " decoderIndex: " << decoderIndex
//// << " blockIndex: " << blockIndex;
//
// if (m_frameHead == -1) // initial state
// {
// m_decoderIndexHead = decoderIndex; // new decoder slot head
// m_frameHead = frameIndex;
// initReadIndex(); // reset read index
// initDecodeAllSlots(); // initialize all slots
// }
// else
// {
// int frameDelta = m_frameHead - frameIndex;
//
// if (frameDelta < 0)
// {
// if (-frameDelta < nbDecoderSlots) // new frame head not too new
// {
// //qDebug() << "SDRdaemonSourceBuffer::writeData: new frame head (1): " << frameIndex << ":" << frameDelta << ":" << decoderIndex;
// m_decoderIndexHead = decoderIndex; // new decoder slot head
// m_frameHead = frameIndex;
// checkSlotData(decoderIndex);
// dataAvailable = true;
// initDecodeSlot(decoderIndex); // collect stats and re-initialize current slot
// }
// else if (-frameDelta <= 65536 - nbDecoderSlots) // loss of sync start over
// {
// //qDebug() << "SDRdaemonSourceBuffer::writeData: loss of sync start over (1)" << frameIndex << ":" << frameDelta << ":" << decoderIndex;
// m_decoderIndexHead = decoderIndex; // new decoder slot head
// m_frameHead = frameIndex;
// initReadIndex(); // reset read index
// initDecodeAllSlots(); // re-initialize all slots
// }
// }
// else
// {
// if (frameDelta > 65536 - nbDecoderSlots) // new frame head not too new
// {
// //qDebug() << "SDRdaemonSourceBuffer::writeData: new frame head (2): " << frameIndex << ":" << frameDelta << ":" << decoderIndex;
// m_decoderIndexHead = decoderIndex; // new decoder slot head
// m_frameHead = frameIndex;
// checkSlotData(decoderIndex);
// dataAvailable = true;
// initDecodeSlot(decoderIndex); // collect stats and re-initialize current slot
// }
// else if (frameDelta >= nbDecoderSlots) // loss of sync start over
// {
// //qDebug() << "SDRdaemonSourceBuffer::writeData: loss of sync start over (2)" << frameIndex << ":" << frameDelta << ":" << decoderIndex;
// m_decoderIndexHead = decoderIndex; // new decoder slot head
// m_frameHead = frameIndex;
// initReadIndex(); // reset read index
// initDecodeAllSlots(); // re-initialize all slots
// }
// }
// }
//
// // decoderIndex should now be correctly set
//
}
uint8_t *SDRdaemonSourceBuffer::readData(int32_t length)
{
uint8_t *buffer = (uint8_t *) m_frames;

View File

@ -37,7 +37,6 @@ public:
// R/W operations
void writeData(char *array); //!< Write data into buffer.
void writeData0(char *array, uint32_t length); //!< Write data into buffer.
uint8_t *readData(int32_t length); //!< Read data from buffer
// meta data

View File

@ -195,7 +195,7 @@ void SDRdaemonSourceUDPHandler::processData()
change = true;
}
if (change && (m_samplerate != 0) && (m_centerFrequency != 0))
if (change && (m_samplerate != 0))
{
qDebug("SDRdaemonSourceUDPHandler::processData: m_samplerate: %u m_centerFrequency: %u kHz", m_samplerate, m_centerFrequency);