libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
ndidiscovery.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <promeki/namespace.h>
11#include <promeki/config.h>
12
13#if PROMEKI_ENABLE_NDI
14
15#include <promeki/atomic.h>
16#include <promeki/basicthread.h>
17#include <promeki/list.h>
18#include <promeki/map.h>
19#include <promeki/mutex.h>
20#include <promeki/string.h>
21#include <promeki/timestamp.h>
23
24PROMEKI_NAMESPACE_BEGIN
25
83class NdiDiscovery {
84 public:
93 struct Record {
94 String canonicalName;
95 String urlAddress;
96 TimeStamp firstSeen;
97 TimeStamp lastSeen;
98 };
99
101 using RecordList = ::promeki::List<Record>;
102
109 static NdiDiscovery &instance();
110
117 bool isRunning() const { return _running.value(); }
118
126 RecordList sources() const;
127
141 RecordList sources(int minUptimeMs) const;
142
170 String waitForSource(const String &nameOrPattern, int timeoutMs);
171
181 static String matchCanonical(const RecordList &records,
182 const String &nameOrPattern);
183
190 void setPollIntervalMs(int ms);
191
199 void setGroups(const String &commaSeparated);
200
208 void setExtraIps(const String &commaSeparated);
209
213 int pollIntervalMs() const;
214
221 int64_t uptimeMs() const;
222
223 NdiDiscovery(const NdiDiscovery &) = delete;
224 NdiDiscovery &operator=(const NdiDiscovery &) = delete;
225
226 private:
227 NdiDiscovery();
228 ~NdiDiscovery();
229
230 void workerMain();
231
232 mutable Mutex _mutex;
233 mutable WaitCondition _condRegistry;
234 WaitCondition _condConfig;
235 Map<String, Record> _registry;
236 Atomic<bool> _running{false};
237 Atomic<bool> _shutdown{false};
238 Atomic<bool> _configDirty{false};
239 Atomic<int> _pollIntervalMs{500};
240 String _groups;
241 String _extraIps;
242 TimeStamp _startTime;
243 BasicThread _worker;
244};
245
246PROMEKI_NAMESPACE_END
247
248#endif // PROMEKI_ENABLE_NDI