From efe9b3d45956873da57e6a43832ddcf4edb26f74 Mon Sep 17 00:00:00 2001 From: Tim Stewart Date: Sun, 29 Nov 2020 16:26:32 -0500 Subject: [PATCH] Process FEC and DTMF on Voice frames followed by Sync frame Rather than skipping FEC recalculation and DTMF blanking on Voice frames that do not have a corresponding mini-header (i.e. Voice frames followed by a Sync frame), set aside the frame's data. The data is processed and submitted to the modem/network during the next iteration, once the presence of DV Fast Data can be determined. --- DStarControl.cpp | 47 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/DStarControl.cpp b/DStarControl.cpp index 8cd57e5..adc9de6 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -149,7 +149,9 @@ unsigned int CDStarControl::maybeFixupVoiceFrame( unsigned char mini_header_type = mini_header & DSTAR_SLOW_DATA_TYPE_MASK; if (n == 0U) { - LogMessage("%s frame %u: FEC regeneration disabled for first frame", log_prefix, n); + LogMessage("%s frame %u: delaying FEC and DTMF processing of first voice frame", log_prefix, n); + ::memcpy(voice_sync_data, data, MODEM_DATA_LEN); + *voice_sync_data_len = len; } else if ((n % 2U != 0U) && ((mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA01) || (mini_header_type == DSTAR_SLOW_DATA_TYPE_FASTDATA16))) { @@ -163,14 +165,25 @@ unsigned int CDStarControl::maybeFixupVoiceFrame( *skip_dtmf_blanking_frames = FAST_DATA_BEEP_GRACE_FRAMES; LogMessage("%s frame %u: found fast data (cont.)", log_prefix, n); } else { - errors = m_fec.regenerateDStar(data + offset); + if (n == 1U) { + LogMessage("%s frame 0: *** REGENERATING FEC ***", log_prefix); + errors += m_fec.regenerateDStar(voice_sync_data + offset); + } LogMessage("%s frame %u: *** REGENERATING FEC ***", log_prefix, n); + errors += m_fec.regenerateDStar(data + offset); if (blank_dtmf && (*skip_dtmf_blanking_frames > 0U)) { (*skip_dtmf_blanking_frames)--; + if (n == 1U) + LogMessage("%s frame 0: *** Not BLANKING DTMF (left to skip: %u) ***", + log_prefix, *skip_dtmf_blanking_frames); LogMessage("%s frame %u: *** Not BLANKING DTMF (left to skip: %u) ***", log_prefix, n, *skip_dtmf_blanking_frames); } else if (blank_dtmf && (*skip_dtmf_blanking_frames == 0U)) { + if (n == 1U) { + LogMessage("%s frame 0: *** BLANKING DTMF ***", log_prefix); + blankDTMF(voice_sync_data + offset); + } LogMessage("%s frame %u: *** BLANKING DTMF ***", log_prefix, n); blankDTMF(data + offset); } @@ -439,11 +452,19 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) m_rfBits += 48U; m_rfFrames++; - if (m_net) - writeNetworkDataRF(data, errors, false); + if (m_net) { + if (m_rfN == 1U) + writeNetworkDataRF(m_rfVoiceSyncData, 0U, false); + if (m_rfN >= 1U) + writeNetworkDataRF(data, errors, false); + } - if (m_duplex) - writeQueueDataRF(data); + if (m_duplex) { + if (m_rfN == 1U) + writeQueueDataRF(m_rfVoiceSyncData); + if (m_rfN >= 1U) + writeQueueDataRF(data); + } m_rfN = (m_rfN + 1U) % 21U; } else if (m_rfState == RS_RF_LATE_ENTRY) { @@ -753,13 +774,13 @@ void CDStarControl::writeNetwork() unsigned char n = data[1U]; + data[1U] = TAG_DATA; + unsigned int errors = 0U; if (!m_netHeader.isDataPacket()) errors = maybeFixupVoiceFrame(data, length, 2U, "Net", n, true, m_netVoiceSyncData, &m_netVoiceSyncDataLen, &m_netNextFrameIsFastData, &m_netSkipDTMFBlankingFrames); - data[1U] = TAG_DATA; - // Insert silence and reject if in the past bool ret = insertSilence(data + 1U, n); if (!ret) @@ -778,9 +799,15 @@ void CDStarControl::writeNetwork() m_netFrames++; #if defined(DUMP_DSTAR) - writeFile(data + 1U, length - 1U); + if (n == 1U) + writeFile(m_netVoiceSyncData + 1U, m_netVoiceSyncDataLen - 1U); + if (n >= 1U) + writeFile(data + 1U, length - 1U); #endif - writeQueueDataNet(data + 1U); + if (n == 1U) + writeQueueDataNet(m_netVoiceSyncData + 1U); + if (n >= 1U) + writeQueueDataNet(data + 1U); } else { CUtils::dump("D-Star, unknown data from network", data, DSTAR_FRAME_LENGTH_BYTES + 1U); }