diff --git a/src/network/FNENetwork.cpp b/src/network/FNENetwork.cpp
index 74579b51..c6cd0f91 100644
--- a/src/network/FNENetwork.cpp
+++ b/src/network/FNENetwork.cpp
@@ -89,6 +89,7 @@ FNENetwork::FNENetwork(HostFNE* host, const std::string& address, uint16_t port,
m_peers(),
m_maintainenceTimer(1000U, pingTime),
m_updateLookupTimer(1000U, (updateLookupTime * 60U)),
+ m_callInProgress(false),
m_verbose(verbose)
{
assert(host != nullptr);
@@ -156,6 +157,11 @@ void FNENetwork::clock(uint32_t ms)
m_peers.erase(peerId);
}
+ // roll the RTP timestamp if no call is in progress
+ if (!m_callInProgress) {
+ frame::RTPHeader::resetStartTime();
+ }
+
m_maintainenceTimer.start();
}
diff --git a/src/network/FNENetwork.h b/src/network/FNENetwork.h
index 080db6b2..6dfd1cf3 100644
--- a/src/network/FNENetwork.h
+++ b/src/network/FNENetwork.h
@@ -237,6 +237,8 @@ namespace network
Timer m_maintainenceTimer;
Timer m_updateLookupTimer;
+ bool m_callInProgress;
+
bool m_verbose;
/// Helper to send the list of whitelisted RIDs to the specified peer.
diff --git a/src/network/Network.cpp b/src/network/Network.cpp
index 3e549e19..47cf1efb 100644
--- a/src/network/Network.cpp
+++ b/src/network/Network.cpp
@@ -248,6 +248,13 @@ void Network::clock(uint32_t ms)
return;
}
+ // roll the RTP timestamp if no call is in progress
+ if ((m_status == NET_STAT_RUNNING) &&
+ (m_rxDMRStreamId[0U] == 0U && m_rxDMRStreamId[1U] == 0U) &&
+ m_rxP25StreamId == 0U && m_rxNXDNStreamId == 0U) {
+ frame::RTPHeader::resetStartTime();
+ }
+
sockaddr_storage address;
uint32_t addrLen;
diff --git a/src/network/RTPHeader.cpp b/src/network/RTPHeader.cpp
index bc7fda86..a02aa03a 100644
--- a/src/network/RTPHeader.cpp
+++ b/src/network/RTPHeader.cpp
@@ -119,3 +119,11 @@ void RTPHeader::encode(uint8_t* data)
__SET_UINT32(m_timestamp, data, 4U); // Timestamp
__SET_UINT32(m_ssrc, data, 8U); // Synchronization Source Identifier
}
+
+///
+/// Helper to reset the start timestamp.
+///
+void RTPHeader::resetStartTime()
+{
+ m_wcStart = hrc::hrc_t();
+}
diff --git a/src/network/RTPHeader.h b/src/network/RTPHeader.h
index ddf7c706..072ea14b 100644
--- a/src/network/RTPHeader.h
+++ b/src/network/RTPHeader.h
@@ -62,6 +62,9 @@ namespace network
/// Encode a RTP header.
virtual void encode(uint8_t* data);
+ /// Helper to reset the start timestamp.
+ static void resetStartTime();
+
public:
/// RTP Protocol Version.
__READONLY_PROPERTY(uint8_t, version, Version);
diff --git a/src/network/fne/TagDMRData.cpp b/src/network/fne/TagDMRData.cpp
index eb02b045..8bfe3e49 100644
--- a/src/network/fne/TagDMRData.cpp
+++ b/src/network/fne/TagDMRData.cpp
@@ -156,6 +156,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
LogMessage(LOG_NET, "DMR, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u",
peerId, srcId, dstId, duration / 1000, streamId);
+ m_network->m_callInProgress = false;
}
// is this a new call stream?
@@ -194,6 +195,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
status.streamId = streamId;
m_status[dstId] = status; // this *could* be an issue if a dstId appears on both slots somehow...
LogMessage(LOG_NET, "DMR, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId);
+ m_network->m_callInProgress = true;
}
}
@@ -218,6 +220,9 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
LogDebug(LOG_NET, "DMR, srcPeer = %u, dstPeer = %u, seqNo = %u, srcId = %u, dstId = %u, flco = $%02X, slotNo = %u, len = %u, pktSeq = %u, stream = %u",
peerId, peer.first, seqNo, srcId, dstId, flco, slotNo, len, pktSeq, streamId);
}
+
+ if (!m_network->m_callInProgress)
+ m_network->m_callInProgress = true;
}
}
diff --git a/src/network/fne/TagNXDNData.cpp b/src/network/fne/TagNXDNData.cpp
index fabe861b..4fe24033 100644
--- a/src/network/fne/TagNXDNData.cpp
+++ b/src/network/fne/TagNXDNData.cpp
@@ -128,6 +128,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
LogMessage(LOG_NET, "NXDN, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u",
peerId, srcId, dstId, duration / 1000, streamId);
+ m_network->m_callInProgress = false;
}
// is this a new call stream?
@@ -165,6 +166,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
status.streamId = streamId;
m_status[dstId] = status;
LogMessage(LOG_NET, "NXDN, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId);
+ m_network->m_callInProgress = true;
}
}
}
@@ -190,6 +192,9 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
LogDebug(LOG_NET, "NXDN, srcPeer = %u, dstPeer = %u, messageType = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u",
peerId, peer.first, messageType, srcId, dstId, len, pktSeq, streamId);
}
+
+ if (!m_network->m_callInProgress)
+ m_network->m_callInProgress = true;
}
}
diff --git a/src/network/fne/TagP25Data.cpp b/src/network/fne/TagP25Data.cpp
index 28672b64..fecac383 100644
--- a/src/network/fne/TagP25Data.cpp
+++ b/src/network/fne/TagP25Data.cpp
@@ -170,6 +170,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
LogMessage(LOG_NET, "P25, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u",
peerId, srcId, dstId, duration / 1000, streamId);
+ m_network->m_callInProgress = false;
}
// is this a new call stream?
@@ -207,6 +208,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
status.streamId = streamId;
m_status[dstId] = status;
LogMessage(LOG_NET, "P25, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId);
+ m_network->m_callInProgress = true;
}
}
}
@@ -232,6 +234,9 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
LogDebug(LOG_NET, "P25, srcPeer = %u, dstPeer = %u, duid = $%02X, lco = $%02X, MFId = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u",
peerId, peer.first, duid, lco, MFId, srcId, dstId, len, pktSeq, streamId);
}
+
+ if (!m_network->m_callInProgress)
+ m_network->m_callInProgress = true;
}
}