From b2844bc0a6a47a906d6a120942be322ccca03b34 Mon Sep 17 00:00:00 2001 From: Tim Stewart Date: Sun, 13 Dec 2020 16:28:47 -0500 Subject: [PATCH] Avoid FEC regeneration and DTMF blanking for null AMBE data FEC recalculation always reports errors for null AMBE frames, and there is no DTMF present by definition. In practice, null AMBE data is often (always?) sent by the Kenwood TH-D74 in the first 21 voice frames, and I've also seen it at the end of a fast data transmission. --- DStarControl.cpp | 27 +++++++++++++++++++++------ DStarDefines.h | 2 ++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/DStarControl.cpp b/DStarControl.cpp index adc9de6..95e3096 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -165,12 +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 { - if (n == 1U) { + bool voice_sync_data_is_null_ambe_data = false; + bool data_is_null_ambe_data = false; + if ((n == 1U) && (::memcmp(voice_sync_data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0)) { + LogMessage("%s frame 0: *** Null AMBE data detected in voice frame ***", log_prefix); + voice_sync_data_is_null_ambe_data = true; + } + if (::memcmp(data + offset, DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0) { + LogMessage("%s frame %u: *** Null AMBE data detected in voice frame ***", log_prefix, n); + data_is_null_ambe_data = true; + } + + if ((n == 1U) && !voice_sync_data_is_null_ambe_data) { 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 (!data_is_null_ambe_data) { + 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)--; @@ -180,12 +193,14 @@ unsigned int CDStarControl::maybeFixupVoiceFrame( 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) { + if ((n == 1U) && !voice_sync_data_is_null_ambe_data) { 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); + if (!data_is_null_ambe_data) { + LogMessage("%s frame %u: *** BLANKING DTMF ***", log_prefix, n); + blankDTMF(data + offset); + } } } diff --git a/DStarDefines.h b/DStarDefines.h index 46f4c1d..2a3e90c 100644 --- a/DStarDefines.h +++ b/DStarDefines.h @@ -28,6 +28,8 @@ const unsigned char DSTAR_END_PATTERN_BYTES[] = { TAG_EOT, 0x55, 0x55, 0x55, 0x5 const unsigned int DSTAR_END_PATTERN_LENGTH_BYTES = 6U; const unsigned char DSTAR_NULL_AMBE_DATA_BYTES[] = { 0x9E, 0x8D, 0x32, 0x88, 0x26, 0x1A, 0x3F, 0x61, 0xE8 }; +// DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED is DSTAR_NULL_AMBE_DATA_BYTES XORed with DSTAR_SCRAMBLER_BYTES. +const unsigned char DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED[] = { 0xEEU, 0xC2U, 0xA1U, 0xC8U, 0x42U, 0x6EU, 0x52U, 0x51U, 0xC3U }; const unsigned char DSTAR_NULL_SLOW_SYNC_BYTES[] = { 0x55, 0x2D, 0x16 }; // Note that these are already scrambled, 0x66 0x66 0x66 otherwise