diff --git a/src/host/Host.Config.cpp b/src/host/Host.Config.cpp index 983328ef..a9ba8af1 100644 --- a/src/host/Host.Config.cpp +++ b/src/host/Host.Config.cpp @@ -511,6 +511,7 @@ bool Host::createModem() uint16_t dmrFifoLength = (uint16_t)modemConf["dmrFifoLength"].as(DMR_TX_BUFFER_LEN); uint16_t p25FifoLength = (uint16_t)modemConf["p25FifoLength"].as(P25_TX_BUFFER_LEN); uint16_t nxdnFifoLength = (uint16_t)modemConf["nxdnFifoLength"].as(NXDN_TX_BUFFER_LEN); + uint32_t v24P25TxQueueSize = p25FifoLength; yaml::Node dfsiParams = modemConf["dfsi"]; @@ -645,6 +646,14 @@ bool Host::createModem() LogInfo(" DFSI FSC Initiator: %s", fscInitiator ? "yes" : "no"); LogInfo(" DFSI TIA-102 Frames: %s", dfsiTIAMode ? "yes" : "no"); } + + // DFSI startup can enqueue a burst of timed frames before the modem + // thread starts draining; keep the TX scheduler queue larger than the + // raw modem FIFO to avoid clipping first-call onset. + uint32_t minV24TxQueueSize = m_p25QueueSizeBytes + p25FifoLength; + if (v24P25TxQueueSize < minV24TxQueueSize) { + v24P25TxQueueSize = minV24TxQueueSize; + } } if (g_remoteModemMode) { @@ -708,6 +717,8 @@ bool Host::createModem() LogInfo(" NXDN Queue Size: %u (%u bytes)", nxdnQueueSize, m_nxdnQueueSizeBytes); LogInfo(" DMR FIFO Size: %u bytes", dmrFifoLength); LogInfo(" P25 FIFO Size: %u bytes", p25FifoLength); + if (m_isModemDFSI) + LogInfo(" P25 DFSI TX Queue Size: %u bytes", v24P25TxQueueSize); LogInfo(" NXDN FIFO Size: %u bytes", nxdnFifoLength); if (ignoreModemConfigArea) { @@ -728,7 +739,7 @@ bool Host::createModem() } if (m_isModemDFSI) { - m_modem = new ModemV24(modemPort, m_duplex, m_p25QueueSizeBytes, p25FifoLength, rtrt, jitter, + m_modem = new ModemV24(modemPort, m_duplex, m_p25QueueSizeBytes, v24P25TxQueueSize, rtrt, jitter, dumpModemStatus, displayModemDebugMessages, trace, debug); ((ModemV24*)m_modem)->setCallTimeout(dfsiCallTimeout); ((ModemV24*)m_modem)->setTIAFormat(dfsiTIAMode);