From cdb85b87c07cdd912c765cdbfe3e32586cc34b0a Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Fri, 14 May 2021 16:05:16 +0200 Subject: Add EDI UDP multicast support --- TODO.md | 5 ----- doc/example.mux | 8 +++++++- src/input/Edi.cpp | 10 +++++++++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/TODO.md b/TODO.md index 13ed2c6..3ddc797 100644 --- a/TODO.md +++ b/TODO.md @@ -20,11 +20,6 @@ and which ones would make sense to add. Also, there is no documentation on the possibilites of packet data. -Multicast support for the UDP input ------------------------------------ -The current UDP input implementation cannot join a multicast group. - - Improvements for inputs ----------------------- Add statistics to UDP input, in a similar way that ZeroMQ offers statistics. diff --git a/doc/example.mux b/doc/example.mux index 92a644d..f170bda 100644 --- a/doc/example.mux +++ b/doc/example.mux @@ -192,9 +192,15 @@ subchannels { ; for audio and dabplus, EDI input is available. It supports TCP server and UDP inputproto edi - ; Accepts connection to port 9001 from any interface + ; Accepts connection to port 9001 from any interface. Prefer disabling PFT when using TCP. inputuri "tcp://0.0.0.0:9001" + ; For UDP, PFT should be enabled at the sender. + ; Unicast UDP input: + ;inputuri "udp://:9001" + ; Multicast UDP input: + ;inputuri "udp://@239.10.0.1:9001" + ; Two buffer-management types are available: prebuffering and timestamped. ; prebuffering will accumulate a few frames before it starts streaming, and each ; time there is a buffer underrun (similar to how the ZMQ input works) diff --git a/src/input/Edi.cpp b/src/input/Edi.cpp index e206f28..338a8e6 100644 --- a/src/input/Edi.cpp +++ b/src/input/Edi.cpp @@ -80,6 +80,7 @@ Edi::~Edi() { void Edi::open(const std::string& name) { const std::regex re_udp("udp://:([0-9]+)"); + const std::regex re_udp_multicast("udp://@([0-9.]+):([0-9]+)"); const std::regex re_tcp("tcp://(.*):([0-9]+)"); lock_guard lock(m_mutex); @@ -95,7 +96,14 @@ void Edi::open(const std::string& name) m_input_used = InputUsed::UDP; m_udp_sock.reinit(udp_port); m_udp_sock.setBlocking(false); - // TODO multicast + } + else if (std::regex_match(name, m, re_udp_multicast)) { + const string multicast_address = m[1].str(); + const int udp_port = std::stoi(m[2].str()); + m_input_used = InputUsed::UDP; + m_udp_sock.reinit(udp_port); + m_udp_sock.setBlocking(false); + m_udp_sock.joinGroup(multicast_address.c_str()); } else if (std::regex_match(name, m, re_tcp)) { m_input_used = InputUsed::TCP; -- cgit v1.2.3