From 9f88014a8ed0da314c211c152cec8f8c771fa58f Mon Sep 17 00:00:00 2001 From: Dave Behnke <916775+dbehnke@users.noreply.github.com> Date: Sun, 28 Dec 2025 04:53:00 -0500 Subject: [PATCH] Fix M17 payload offset for tcd and add stream keepalive --- reflector/M17Protocol.cpp | 30 ++++++++++++++++++++++++++---- reflector/M17Protocol.h | 1 + 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/reflector/M17Protocol.cpp b/reflector/M17Protocol.cpp index 14b74b7..d1d41e5 100644 --- a/reflector/M17Protocol.cpp +++ b/reflector/M17Protocol.cpp @@ -118,15 +118,21 @@ void CM17Protocol::Task(void) auto secondFrame = std::unique_ptr(new CDvFramePacket(*Frame.get())); // Overwrite payload of second frame uint8_t* secondPayload = const_cast(secondFrame->GetCodecData(cType)); - memcpy(secondPayload, part2, 16); // Copy half size, pad rest - memset(secondPayload + halfSize, 0, 16 - halfSize); + + if (cType == ECodecType::c2_3200) { + // For 3200, tcd expects the second packet to have data at offset 8 + memset(secondPayload, 0, 16); + memcpy(secondPayload + 8, part2, 8); + } else { + // For 1600, tcd reads everything from first packet, but let's be safe and put it at 0 + memcpy(secondPayload, part2, 16); + memset(secondPayload + halfSize, 0, 16 - halfSize); + } if (Frame->IsLastPacket()) Frame->SetLastPacket(false); - std::cout << "DEBUG: M17 Split Push 1" << std::endl; OnDvFramePacketIn(Frame, &Ip); - std::cout << "DEBUG: M17 Split Push 2" << std::endl; OnDvFramePacketIn(secondFrame, &Ip); } else @@ -272,6 +278,22 @@ void CM17Protocol::OnDvHeaderPacketIn(std::unique_ptr &Header, } } +void CM17Protocol::OnDvFramePacketIn(std::unique_ptr &Frame, const CIp *Ip) +{ + // Keep the client alive + if (Ip) { + CClients *clients = g_Reflector.GetClients(); + auto client = clients->FindClient(*Ip, EProtocol::m17); + if (client) { + client->Heard(); + } + g_Reflector.ReleaseClients(); + } + + // Call base implementation to push to stream + CProtocol::OnDvFramePacketIn(Frame, Ip); +} + //////////////////////////////////////////////////////////////////////////////////////// // queue helper diff --git a/reflector/M17Protocol.h b/reflector/M17Protocol.h index efcc57a..69723c6 100644 --- a/reflector/M17Protocol.h +++ b/reflector/M17Protocol.h @@ -83,6 +83,7 @@ protected: // stream helpers void OnDvHeaderPacketIn(std::unique_ptr &, const CIp &); + virtual void OnDvFramePacketIn(std::unique_ptr &, const CIp * = nullptr) override; private: // packet decoding helpers