aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2019-11-15 16:14:11 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2019-11-15 16:14:11 +0100
commit85e65ee17160ade86b2179d27b387b27f7e4396f (patch)
tree874cc798474247296003ed8855b3f6245bca15c4
parent86bc3fc5e0ed8cdf8db9bfa7f5488162022f0a85 (diff)
downloadODR-SourceCompanion-85e65ee17160ade86b2179d27b387b27f7e4396f.tar.gz
ODR-SourceCompanion-85e65ee17160ade86b2179d27b387b27f7e4396f.tar.bz2
ODR-SourceCompanion-85e65ee17160ade86b2179d27b387b27f7e4396f.zip
Fix PAD UDP send bug
-rw-r--r--src/AVTInput.cpp26
-rw-r--r--src/AVTInput.h4
2 files changed, 17 insertions, 13 deletions
diff --git a/src/AVTInput.cpp b/src/AVTInput.cpp
index 3bf1bd6..2610b5c 100644
--- a/src/AVTInput.cpp
+++ b/src/AVTInput.cpp
@@ -57,7 +57,7 @@ AVTInput::AVTInput(const std::string& input_uri,
_jitterBufferSize(jitterBufferSize),
_output_packet(2048),
- _input_pad_packet(2048),
+ _pad_packet(2048),
_ordered(5000, _jitterBufferSize),
_lastInfoFrameType(_typeCantExtract)
{ }
@@ -313,10 +313,12 @@ void AVTInput::_sendPADFrame()
0xAD,
static_cast<uint8_t>(frame.size())});
- Socket::UDPPacket packet;
- packet.buffer = buf;
- copy(frame.begin(), frame.end(), back_inserter(packet.buffer));
- _input_pad_socket.send(packet);
+ // Always keep the same packet, as it contains the destination address.
+ // This function only gets called from _interpretMessage(), which
+ // only gets called after a successful packet reception.
+ _pad_packet.buffer = move(buf);
+ copy(frame.begin(), frame.end(), back_inserter(_pad_packet.buffer));
+ _input_pad_socket.send(_pad_packet);
}
}
@@ -326,7 +328,7 @@ void AVTInput::_sendPADFrame()
* Command code : 1 Byte
* * 0x17 = Request for 1 PAD Frame
*/
-void AVTInput::_interpretMessage(const uint8_t* data, size_t size)
+void AVTInput::_interpretMessage(const uint8_t *data, size_t size)
{
if (size >= 2) {
if (data[0] == 0xFD) {
@@ -341,12 +343,12 @@ void AVTInput::_interpretMessage(const uint8_t* data, size_t size)
bool AVTInput::_checkMessage()
{
- const auto packet = _input_pad_socket.receive(2048);
- if (packet.buffer.empty()) {
+ _pad_packet = _input_pad_socket.receive(2048);
+ if (_pad_packet.buffer.empty()) {
return false;
}
- _interpretMessage(packet.buffer.data(), packet.buffer.size());
+ _interpretMessage(_pad_packet.buffer.data(), _pad_packet.buffer.size());
return true;
}
@@ -354,9 +356,11 @@ bool AVTInput::_checkMessage()
void AVTInput::_purgeMessages()
{
int nb = 0;
- while (not _input_pad_socket.receive(2048).buffer.empty()) {
+ do {
+ _pad_packet = _input_pad_socket.receive(2048);
nb++;
- }
+ } while (not _pad_packet.buffer.empty());
+
if (nb>0) DEBUG("%d messages purged\n", nb);
}
diff --git a/src/AVTInput.h b/src/AVTInput.h
index 0f58418..2921160 100644
--- a/src/AVTInput.h
+++ b/src/AVTInput.h
@@ -105,7 +105,7 @@ class AVTInput
Socket::UDPSocket _output_socket;
Socket::UDPPacket _output_packet;
Socket::UDPSocket _input_pad_socket;
- Socket::UDPPacket _input_pad_packet;
+ Socket::UDPPacket _pad_packet;
OrderedQueue _ordered;
std::queue<std::vector<uint8_t> > _padFrameQueue;
@@ -128,7 +128,7 @@ class AVTInput
void _sendCtrlMessage();
void _sendPADFrame();
- void _interpretMessage(const uint8_t* data, size_t size);
+ void _interpretMessage(const uint8_t *data, size_t size);
bool _checkMessage();
void _purgeMessages();