From dc24abb23e6ea127401ab0c0b869a12cc6d46155 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Thu, 14 Dec 2017 13:53:09 +0000 Subject: [PATCH] Fix the lost frames count and the data type when a frame is missing. --- DMRSlot.cpp | 34 +++++++++++++++++++--------------- DMRSlot.h | 2 +- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 5f4b0ce..c96dd6e 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -977,18 +977,18 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) bool missing = dmrData.isMissing(); + unsigned char dataType; + if (missing) { m_netN = (m_netN + 1U) % 6U; - repeatFrame(data + 2U); - m_netLost++; + dataType = repeatFrame(data + 2U); } else { + dataType = dmrData.getDataType(); m_netN = dmrData.getN(); m_networkWatchdog.start(); m_netMissed = 0U; } - unsigned char dataType = dmrData.getDataType(); - if (dataType == DT_VOICE_LC_HEADER) { if (m_netState == RS_NET_AUDIO) return; @@ -1324,10 +1324,6 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) // Convert the Audio Sync to be from the BS or MS as needed CSync::addDMRAudioSync(data + 2U, m_duplex); - // Initialise the lost packet data - if (m_netFrames == 0U) - m_netLost = 0U; - if (!m_netTimeout) writeQueueNet(data); @@ -1336,6 +1332,9 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) m_netEmbeddedData[m_netEmbeddedWriteN].reset(); + if (missing) + m_netLost++; + m_netFrames++; #if defined(DUMP_DMR) @@ -1464,13 +1463,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) data[0U] = TAG_DATA; data[1U] = 0x00U; - // Initialise the lost packet data - if (m_netFrames == 0U) - m_netLost = 0U; - if (!m_netTimeout) writeQueueNet(data); + if (missing) + m_netLost++; + m_netFrames++; #if defined(DUMP_DMR) @@ -1918,7 +1916,7 @@ void CDMRSlot::closeFile() } } -void CDMRSlot::repeatFrame(unsigned char* data) +unsigned char CDMRSlot::repeatFrame(unsigned char* data) { // Repeat the last audio for 60ms then silence after that if (m_netMissed == 0U) { @@ -1931,6 +1929,10 @@ void CDMRSlot::repeatFrame(unsigned char* data) if (m_netN == 0U) { CSync::addDMRAudioSync(data, m_duplex); + + m_netMissed++; + + return DT_VOICE_SYNC; } else { m_netEmbeddedLC.getData(data, 0U); @@ -1938,7 +1940,9 @@ void CDMRSlot::repeatFrame(unsigned char* data) emb.setColorCode(m_colorCode); emb.setLCSS(0U); emb.getData(data); - } - m_netMissed++; + m_netMissed++; + + return DT_VOICE; + } } diff --git a/DMRSlot.h b/DMRSlot.h index f184a46..f70f6d4 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -139,7 +139,7 @@ private: bool writeFile(const unsigned char* data); void closeFile(); - void repeatFrame(unsigned char* data); + unsigned char repeatFrame(unsigned char* data); static void setShortLC(unsigned int slotNo, unsigned int id, FLCO flco = FLCO_GROUP, ACTIVITY_TYPE type = ACTIVITY_NONE); };