Skip to content

Commit

Permalink
Process FEC and DTMF on Voice frames followed by Sync frame
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
timclassic committed Nov 29, 2020
1 parent 8874d12 commit efe9b3d
Showing 1 changed file with 37 additions and 10 deletions.
47 changes: 37 additions & 10 deletions DStarControl.cpp
Expand Up @@ -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))) {
Expand All @@ -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);
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand All @@ -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);
}
Expand Down

0 comments on commit efe9b3d

Please sign in to comment.