Fix M17 payload offset for tcd and add stream keepalive

pull/23/head
Dave Behnke 1 month ago
parent 02fd824bd0
commit 9f88014a8e

@ -118,15 +118,21 @@ void CM17Protocol::Task(void)
auto secondFrame = std::unique_ptr<CDvFramePacket>(new CDvFramePacket(*Frame.get()));
// Overwrite payload of second frame
uint8_t* secondPayload = const_cast<uint8_t*>(secondFrame->GetCodecData(cType));
memcpy(secondPayload, part2, 16); // Copy half size, pad rest
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<CDvHeaderPacket> &Header,
}
}
void CM17Protocol::OnDvFramePacketIn(std::unique_ptr<CDvFramePacket> &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

@ -83,6 +83,7 @@ protected:
// stream helpers
void OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &, const CIp &);
virtual void OnDvFramePacketIn(std::unique_ptr<CDvFramePacket> &, const CIp * = nullptr) override;
private:
// packet decoding helpers

Loading…
Cancel
Save

Powered by TurnKey Linux.