libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
multicastreceiver.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
13#include <functional>
14#include <promeki/function.h>
15#include <promeki/atomic.h>
16#include <promeki/buffer.h>
17#include <promeki/error.h>
18#include <promeki/list.h>
21#include <promeki/string.h>
22#include <promeki/thread.h>
23#include <promeki/udpsocket.h>
24
25PROMEKI_NAMESPACE_BEGIN
26
104class MulticastReceiver : public Thread {
105 PROMEKI_OBJECT(MulticastReceiver, Thread)
106 public:
117 using DatagramCallback = Function<void(Buffer data, const SocketAddress &sender)>;
118
127 struct GroupEntry {
129 SocketAddress group;
131 SocketAddress source;
133 bool isSSM = false;
134 };
135
137 using GroupList = ::promeki::List<GroupEntry>;
138
140 static constexpr size_t DefaultMaxPacketSize = 2048;
141
143 static constexpr unsigned int DefaultReceiveTimeoutMs = 200;
144
149 MulticastReceiver(ObjectBase *parent = nullptr);
150
152 ~MulticastReceiver() override;
153
164 void setLocalAddress(const SocketAddress &address);
165
167 const SocketAddress &localAddress() const { return _localAddress; }
168
178 void setInterface(const String &iface);
179
181 const String &interfaceName() const { return _interfaceName; }
182
192 void setMaxPacketSize(size_t bytes);
193
195 size_t maxPacketSize() const { return _maxPacketSize; }
196
209 void setReceiveTimeout(unsigned int timeoutMs);
210
212 unsigned int receiveTimeout() const { return _receiveTimeoutMs; }
213
223 void setThreadName(const String &name);
224
226 const String &threadName() const { return _threadName; }
227
236 void setDatagramCallback(DatagramCallback callback);
237
245 Error addGroup(const SocketAddress &group);
246
255 Error addSourceGroup(const SocketAddress &group, const SocketAddress &source);
256
258 const GroupList &groups() const { return _groups; }
259
269 Error start();
270
279 void stop();
280
282 bool isActive() const { return _active.value(); }
283
295 UdpSocket *socket() const { return _socket.get(); }
296
306 uint64_t datagramCount() const { return _datagramCount.value(); }
307
312 uint64_t byteCount() const { return _byteCount.value(); }
313
324 PROMEKI_SIGNAL(datagramReceived, Buffer, SocketAddress);
325
327 PROMEKI_SIGNAL(receiveError, Error);
328
329 protected:
331 void run() override;
332
333 private:
334 Error openAndJoin();
335 void closeAndLeave();
336
337 UdpSocket::UPtr _socket;
338 MulticastManager _multicastManager;
339 SocketAddress _localAddress;
340 String _interfaceName;
341 String _threadName;
342 size_t _maxPacketSize = DefaultMaxPacketSize;
343 unsigned int _receiveTimeoutMs = DefaultReceiveTimeoutMs;
344 DatagramCallback _callback;
345 GroupList _groups;
346
347 Atomic<bool> _active;
348 Atomic<bool> _stopRequested;
349 Atomic<uint64_t> _datagramCount;
350 Atomic<uint64_t> _byteCount;
351};
352
353PROMEKI_NAMESPACE_END
354
355#endif // PROMEKI_ENABLE_NETWORK