sACN  HEAD (unstable)
Implementation of ANSI E1.31 (Streaming ACN)
View other versions:
Loading...
Searching...
No Matches
merge_receiver.h
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright 2024 ETC Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 ******************************************************************************
16 * This file is a part of sACN. For more information, go to:
17 * https://github.com/ETCLabs/sACN
18 *****************************************************************************/
19
20#ifndef SACN_CPP_MERGE_RECEIVER_H_
21#define SACN_CPP_MERGE_RECEIVER_H_
22
28#include "sacn/cpp/common.h"
29
30#include "sacn/merge_receiver.h"
31#include "etcpal/cpp/inet.h"
33#include "etcpal/cpp/uuid.h"
34
41namespace sacn
42{
43
44namespace detail
45{
49}; // namespace detail
50
61{
62public:
65
71 {
72 public:
73 NotifyHandler() = default;
74 virtual ~NotifyHandler() = default;
75
80 NotifyHandler(const NotifyHandler& other) = default;
81
87 NotifyHandler& operator=(const NotifyHandler& other) = default;
88
93 NotifyHandler(NotifyHandler&& other) = default;
94
101
125 virtual void HandleMergedData(Handle handle, const SacnRecvMergedData& merged_data) = 0;
126
146 virtual void HandleNonDmxData(Handle receiver_handle,
147 const etcpal::SockAddr& source_addr,
148 const SacnRemoteSource& source_info,
149 const SacnRecvUniverseData& universe_data)
150 {
151 ETCPAL_UNUSED_ARG(receiver_handle);
152 ETCPAL_UNUSED_ARG(source_addr);
153 ETCPAL_UNUSED_ARG(source_info);
154 ETCPAL_UNUSED_ARG(universe_data);
155 }
156
163 virtual void HandleSourcesLost(Handle handle, uint16_t universe, const std::vector<SacnLostSource>& lost_sources)
164 {
165 ETCPAL_UNUSED_ARG(handle);
166 ETCPAL_UNUSED_ARG(universe);
167 ETCPAL_UNUSED_ARG(lost_sources);
168 }
169
179 virtual void HandleSamplingPeriodStarted(Handle handle, uint16_t universe)
180 {
181 ETCPAL_UNUSED_ARG(handle);
182 ETCPAL_UNUSED_ARG(universe);
183 }
184
199 virtual void HandleSamplingPeriodEnded(Handle handle, uint16_t universe)
200 {
201 ETCPAL_UNUSED_ARG(handle);
202 ETCPAL_UNUSED_ARG(universe);
203 }
204
211 virtual void HandleSourcePapLost(Handle handle, uint16_t universe, const SacnRemoteSource& source)
212 {
213 ETCPAL_UNUSED_ARG(handle);
214 ETCPAL_UNUSED_ARG(universe);
215 ETCPAL_UNUSED_ARG(source);
216 }
217
227 virtual void HandleSourceLimitExceeded(Handle handle, uint16_t universe)
228 {
229 ETCPAL_UNUSED_ARG(handle);
230 ETCPAL_UNUSED_ARG(universe);
231 }
232 };
233
238 struct Settings
239 {
240 /********* Required values **********/
241
243 uint16_t universe_id{0};
244
245 /********* Optional values **********/
246
249
252
257 bool use_pap{true};
258
261
263 Settings() = default;
264
268 Settings(uint16_t new_universe_id);
269
270 bool IsValid() const;
271 };
272
278 {
281
284 std::vector<SacnMcastInterface> netints;
285
287 bool no_netints{false};
288
290 NetintList() = default;
291 NetintList(sacn_merge_receiver_t merge_receiver_handle, McastMode mcast_mode);
292 NetintList(sacn_merge_receiver_t merge_receiver_handle, const std::vector<SacnMcastInterface>& network_interfaces);
293 };
294
314
315 MergeReceiver() = default;
316 virtual ~MergeReceiver() = default;
317
318 MergeReceiver(const MergeReceiver& other) = delete;
319 MergeReceiver& operator=(const MergeReceiver& other) = delete;
320 MergeReceiver(MergeReceiver&& other) = default;
323 etcpal::Error Startup(const Settings& settings, NotifyHandler& notify_handler, McastMode mcast_mode);
324 etcpal::Error Startup(const Settings& settings,
325 NotifyHandler& notify_handler,
326 std::vector<SacnMcastInterface>& netints);
327 void Shutdown();
330 etcpal::Error ChangeUniverse(uint16_t new_universe_id);
332 etcpal::Error ChangeUniverseAndFootprint(uint16_t new_universe_id, const SacnRecvUniverseSubrange& new_footprint);
333 std::vector<EtcPalMcastNetintId> GetNetworkInterfaces();
335
336 static etcpal::Error ResetNetworking(McastMode mcast_mode);
337 static etcpal::Error ResetNetworking(std::vector<SacnMcastInterface>& netints);
338 static etcpal::Error ResetNetworking(std::vector<SacnMcastInterface>& sys_netints,
339 std::vector<NetintList>& netint_lists);
340
341 constexpr Handle handle() const;
342
343private:
344 static SacnMergeReceiverConfig TranslateConfig(const Settings& settings, NotifyHandler& notify_handler);
345
346 Handle handle_;
347};
348
353namespace internal
354{
355extern "C" inline void MergeReceiverCbMergedData(sacn_merge_receiver_t handle,
356 const SacnRecvMergedData* merged_data,
357 void* context)
358{
359 if (context && merged_data)
360 {
361 static_cast<MergeReceiver::NotifyHandler*>(context)->HandleMergedData(MergeReceiver::Handle(handle), *merged_data);
362 }
363}
364
365extern "C" inline void MergeReceiverCbNonDmx(sacn_merge_receiver_t receiver_handle,
366 const EtcPalSockAddr* source_addr,
367 const SacnRemoteSource* source_info,
368 const SacnRecvUniverseData* universe_data,
369 void* context)
370{
371 if (context && source_addr && source_info && universe_data)
372 {
373 static_cast<MergeReceiver::NotifyHandler*>(context)->HandleNonDmxData(MergeReceiver::Handle(receiver_handle),
374 *source_addr, *source_info, *universe_data);
375 }
376}
377
378extern "C" inline void MergeReceiverCbSourcesLost(sacn_merge_receiver_t handle,
379 uint16_t universe,
380 const SacnLostSource* lost_sources,
381 size_t num_lost_sources,
382 void* context)
383{
384 if (context && lost_sources && (num_lost_sources > 0))
385 {
386 std::vector<SacnLostSource> lost_vec(lost_sources, lost_sources + num_lost_sources);
387 static_cast<MergeReceiver::NotifyHandler*>(context)->HandleSourcesLost(MergeReceiver::Handle(handle), universe,
388 lost_vec);
389 }
390}
391
392extern "C" inline void MergeReceiverCbSamplingPeriodStarted(sacn_merge_receiver_t handle,
393 uint16_t universe,
394 void* context)
395{
396 if (context)
397 {
398 static_cast<MergeReceiver::NotifyHandler*>(context)->HandleSamplingPeriodStarted(MergeReceiver::Handle(handle),
399 universe);
400 }
401}
402
403extern "C" inline void MergeReceiverCbSamplingPeriodEnded(sacn_merge_receiver_t handle,
404 uint16_t universe,
405 void* context)
406{
407 if (context)
408 {
409 static_cast<MergeReceiver::NotifyHandler*>(context)->HandleSamplingPeriodEnded(MergeReceiver::Handle(handle),
410 universe);
411 }
412}
413
414extern "C" inline void MergeReceiverCbSourcePapLost(sacn_merge_receiver_t handle,
415 uint16_t universe,
416 const SacnRemoteSource* source,
417 void* context)
418{
419 if (context && source)
420 {
421 static_cast<MergeReceiver::NotifyHandler*>(context)->HandleSourcePapLost(MergeReceiver::Handle(handle), universe,
422 *source);
423 }
424}
425
426extern "C" inline void MergeReceiverCbSourceLimitExceeded(sacn_merge_receiver_t handle,
427 uint16_t universe,
428 void* context)
429{
430 if (context)
431 {
432 static_cast<MergeReceiver::NotifyHandler*>(context)->HandleSourceLimitExceeded(MergeReceiver::Handle(handle),
433 universe);
434 }
435}
436
437}; // namespace internal
438
448inline MergeReceiver::Settings::Settings(uint16_t new_universe_id) : universe_id(new_universe_id)
449{
450}
451
454{
455 return (universe_id > 0) && (footprint.start_address >= 1) &&
456 (footprint.start_address <= SACN_MERGE_RECEIVER_MAX_SLOTS) && (footprint.address_count >= 1) &&
457 (footprint.address_count <= (SACN_MERGE_RECEIVER_MAX_SLOTS - footprint.start_address + 1));
458}
459
466 McastMode mcast_mode = McastMode::kEnabledOnAllInterfaces)
467 : handle(merge_receiver_handle), no_netints(mcast_mode == McastMode::kDisabledOnAllInterfaces)
468{
469}
470
478 const std::vector<SacnMcastInterface>& network_interfaces)
479 : handle(merge_receiver_handle), netints(network_interfaces)
480{
481}
482
509 NotifyHandler& notify_handler,
510 McastMode mcast_mode = McastMode::kEnabledOnAllInterfaces)
511{
512 SacnMergeReceiverConfig config = TranslateConfig(settings, notify_handler);
513
515 if (mcast_mode == McastMode::kDisabledOnAllInterfaces)
516 netint_config.no_netints = true;
517
519 etcpal::Error result = sacn_merge_receiver_create(&config, &c_handle, &netint_config);
520
521 handle_.SetValue(c_handle);
522
523 return result;
524}
525
550 NotifyHandler& notify_handler,
551 std::vector<SacnMcastInterface>& netints)
552{
553 SacnMergeReceiverConfig config = TranslateConfig(settings, notify_handler);
554
557
558 if (netints.empty())
559 {
560 result = sacn_merge_receiver_create(&config, &c_handle, nullptr);
561 }
562 else
563 {
565 netint_config.netints = netints.data();
566 netint_config.num_netints = netints.size();
567
568 result = sacn_merge_receiver_create(&config, &c_handle, &netint_config);
569 }
570
571 handle_.SetValue(c_handle);
572
573 return result;
574}
575
587{
589 handle_.Clear();
590}
591
598{
599 uint16_t result = 0;
600 etcpal_error_t err = sacn_merge_receiver_get_universe(handle_.value(), &result);
601 if (err == kEtcPalErrOk)
602 return result;
603
604 return err;
605}
606
615{
618 if (err == kEtcPalErrOk)
619 return result;
620
621 return err;
622}
623
639inline etcpal::Error MergeReceiver::ChangeUniverse(uint16_t new_universe_id)
640{
641 return sacn_merge_receiver_change_universe(handle_.value(), new_universe_id);
642}
643
654{
655 return sacn_merge_receiver_change_footprint(handle_.value(), &new_footprint);
656}
657
669 const SacnRecvUniverseSubrange& new_footprint)
670{
671 return sacn_merge_receiver_change_universe_and_footprint(handle_.value(), new_universe_id, &new_footprint);
672}
673
679inline std::vector<EtcPalMcastNetintId> MergeReceiver::GetNetworkInterfaces()
680{
681 // This uses a guessing algorithm with a while loop to avoid race conditions.
682 size_t size_guess = 4u;
683 std::vector<EtcPalMcastNetintId> netints(size_guess);
684 size_t num_netints = sacn_merge_receiver_get_network_interfaces(handle_.value(), netints.data(), netints.size());
685
686 while (num_netints > netints.size())
687 {
688 size_guess = num_netints + 4u;
689 netints.resize(size_guess);
690 num_netints = sacn_merge_receiver_get_network_interfaces(handle_.value(), netints.data(), netints.size());
691 }
692
693 netints.resize(num_netints);
694 return netints;
695}
696
708{
710 etcpal_error_t error = sacn_merge_receiver_get_source(handle_.value(), source_handle, &c_info);
711 if (error == kEtcPalErrOk)
712 {
714 res.handle = c_info.handle;
715 res.cid = c_info.cid;
716 res.name = c_info.name;
717 res.addr = c_info.addr;
720 return res;
721 }
722
723 return error;
724}
725
750inline etcpal::Error MergeReceiver::ResetNetworking(McastMode mcast_mode = McastMode::kEnabledOnAllInterfaces)
751{
753 if (mcast_mode == McastMode::kDisabledOnAllInterfaces)
754 netint_config.no_netints = true;
755
756 return sacn_merge_receiver_reset_networking(&netint_config);
757}
758
782inline etcpal::Error MergeReceiver::ResetNetworking(std::vector<SacnMcastInterface>& sys_netints)
783{
784 if (sys_netints.empty())
786
788 netint_config.netints = sys_netints.data();
789 netint_config.num_netints = sys_netints.size();
790
791 return sacn_merge_receiver_reset_networking(&netint_config);
792}
793
823inline etcpal::Error MergeReceiver::ResetNetworking(std::vector<SacnMcastInterface>& sys_netints,
824 std::vector<NetintList>& per_receiver_netint_lists)
825{
826 std::vector<SacnMergeReceiverNetintList> netint_lists_c;
827 netint_lists_c.reserve(per_receiver_netint_lists.size());
828 std::transform(per_receiver_netint_lists.begin(), per_receiver_netint_lists.end(), std::back_inserter(netint_lists_c),
829 [](NetintList& list) {
830 // clang-format off
831 SacnMergeReceiverNetintList c_list = {
832 list.handle,
833 list.netints.data(),
834 list.netints.size(),
835 list.no_netints
836 };
837 // clang-format on
838
839 return c_list;
840 });
841
843 netint_config.netints = sys_netints.data();
844 netint_config.num_netints = sys_netints.size();
845
846 return sacn_merge_receiver_reset_networking_per_receiver(&netint_config, netint_lists_c.data(),
847 netint_lists_c.size());
848}
849
856{
857 return handle_;
858}
859
860inline SacnMergeReceiverConfig MergeReceiver::TranslateConfig(const Settings& settings, NotifyHandler& notify_handler)
861{
862 // clang-format off
863 SacnMergeReceiverConfig config = {
864 settings.universe_id,
865 {
866 internal::MergeReceiverCbMergedData,
867 internal::MergeReceiverCbNonDmx,
868 internal::MergeReceiverCbSourcesLost,
869 internal::MergeReceiverCbSamplingPeriodStarted,
870 internal::MergeReceiverCbSamplingPeriodEnded,
871 internal::MergeReceiverCbSourcePapLost,
872 internal::MergeReceiverCbSourceLimitExceeded,
873 &notify_handler
874 },
875 settings.footprint,
876 settings.source_count_max,
877 settings.use_pap,
878 settings.ip_supported
879 };
880 // clang-format on
881
882 return config;
883}
884
885}; // namespace sacn
886
887#endif // SACN_CPP_MERGE_RECEIVER_H_
ETCPAL_CONSTEXPR_14 void Clear()
ETCPAL_CONSTEXPR_14 void SetValue(const ValueType &new_value)
constexpr ValueType value() const
A base class for a class that receives notification callbacks from a sACN merge receiver.
Definition merge_receiver.h:71
virtual void HandleNonDmxData(Handle receiver_handle, const etcpal::SockAddr &source_addr, const SacnRemoteSource &source_info, const SacnRecvUniverseData &universe_data)
Notify that a non-data packet has been received.
Definition merge_receiver.h:146
NotifyHandler & operator=(const NotifyHandler &other)=default
Defaulted copy assignment operator.
NotifyHandler(const NotifyHandler &other)=default
Defaulted copy constructor.
virtual void HandleSamplingPeriodStarted(Handle handle, uint16_t universe)
Notify that a merge receiver's sampling period has begun.
Definition merge_receiver.h:179
NotifyHandler & operator=(NotifyHandler &&other)=default
Defaulted move assignment operator.
virtual void HandleMergedData(Handle handle, const SacnRecvMergedData &merged_data)=0
Notify that a new data packet has been received and merged.
virtual void HandleSourcesLost(Handle handle, uint16_t universe, const std::vector< SacnLostSource > &lost_sources)
Notify that one or more sources have entered a source loss state.
Definition merge_receiver.h:163
virtual void HandleSourceLimitExceeded(Handle handle, uint16_t universe)
Notify that more than the configured maximum number of sources are currently sending on the universe ...
Definition merge_receiver.h:227
virtual void HandleSamplingPeriodEnded(Handle handle, uint16_t universe)
Notify that a merge receiver's sampling period has ended.
Definition merge_receiver.h:199
NotifyHandler(NotifyHandler &&other)=default
Defaulted move constructor.
virtual void HandleSourcePapLost(Handle handle, uint16_t universe, const SacnRemoteSource &source)
Notify that a source has stopped transmission of per-address priority packets.
Definition merge_receiver.h:211
An instance of sACN Merge Receiver functionality; see Using the sACN Merge Receiver API.
Definition merge_receiver.h:61
std::vector< EtcPalMcastNetintId > GetNetworkInterfaces()
Obtain a vector of this merge receiver's network interfaces.
Definition merge_receiver.h:679
static etcpal::Error ResetNetworking(McastMode mcast_mode)
Resets the underlying network sockets and packet receipt state for all sACN merge receivers.
Definition merge_receiver.h:750
etcpal::Expected< uint16_t > GetUniverse() const
Get the universe this merge receiver is listening to.
Definition merge_receiver.h:597
MergeReceiver & operator=(MergeReceiver &&other)=default
Move a merge receiver instance.
constexpr Handle handle() const
Get the current handle to the underlying C merge receiver.
Definition merge_receiver.h:855
void Shutdown()
Stop listening for sACN data on a universe.
Definition merge_receiver.h:586
etcpal::Error ChangeFootprint(const SacnRecvUniverseSubrange &new_footprint)
Change the footprint within the universe this merge receiver is listening to.
Definition merge_receiver.h:653
etcpal::Error ChangeUniverse(uint16_t new_universe_id)
Change the universe this class is listening to.
Definition merge_receiver.h:639
etcpal::Expected< SacnRecvUniverseSubrange > GetFootprint() const
Get the footprint within the universe this merge receiver is listening to.
Definition merge_receiver.h:614
etcpal::Error ChangeUniverseAndFootprint(uint16_t new_universe_id, const SacnRecvUniverseSubrange &new_footprint)
Change the universe and footprint this merge receiver is listening to.
Definition merge_receiver.h:668
MergeReceiver(MergeReceiver &&other)=default
Move a merge receiver instance.
etcpal::Expected< Source > GetSource(sacn_remote_source_t source_handle)
Gets a copy of the information for the specified merge receiver source.
Definition merge_receiver.h:707
etcpal::Error Startup(const Settings &settings, NotifyHandler &notify_handler, McastMode mcast_mode)
Start listening for sACN data on a universe.
Definition merge_receiver.h:508
A base class for a class that receives common notification callbacks from sACN.
Definition common.h:73
Definition merge_receiver.h:47
C++ wrapper for the sACN init/deinit functions.
etcpal_error_t
kEtcPalErrOk
sacn_ip_support_t
This enum defines how the API module will use IPv4 and IPv6 networking.
Definition common.h:75
uint16_t sacn_remote_source_t
A source discovered on an sACN network that has a CID - used by Receiver and Merge Receiver.
Definition common.h:47
#define SACN_NETINT_CONFIG_DEFAULT_INIT
Initializes the members of a SacnNetintConfig to defaults.
Definition common.h:187
static const sacn_remote_source_t kSacnRemoteSourceInvalid
An invalid remote source handle value.
Definition common.h:49
@ kSacnIpV4AndIpV6
Use both IPv4 and IPv6.
Definition common.h:81
etcpal_error_t sacn_merge_receiver_reset_networking(const SacnNetintConfig *sys_netint_config)
Resets underlying network sockets and packet receipt state, determines network interfaces for all mer...
Definition merge_receiver.c:436
size_t sacn_merge_receiver_get_network_interfaces(sacn_merge_receiver_t handle, EtcPalMcastNetintId *netints, size_t netints_size)
Obtain a list of a merge receiver's network interfaces.
Definition merge_receiver.c:534
etcpal_error_t sacn_merge_receiver_destroy(sacn_merge_receiver_t handle)
Destroy a sACN Merge Receiver instance.
Definition merge_receiver.c:221
etcpal_error_t sacn_merge_receiver_change_footprint(sacn_merge_receiver_t handle, const SacnRecvUniverseSubrange *new_footprint)
Change the footprint within the universe on which an sACN receiver is listening.
Definition merge_receiver.c:381
etcpal_error_t sacn_merge_receiver_reset_networking_per_receiver(const SacnNetintConfig *sys_netint_config, const SacnMergeReceiverNetintList *per_receiver_netint_lists, size_t num_per_receiver_netint_lists)
Resets underlying network sockets and packet receipt state, determines network interfaces for each me...
Definition merge_receiver.c:473
etcpal_error_t sacn_merge_receiver_get_footprint(sacn_merge_receiver_t handle, SacnRecvUniverseSubrange *footprint)
Get the footprint within the universe on which a sACN Merge Receiver is currently listening.
Definition merge_receiver.c:297
etcpal_error_t sacn_merge_receiver_get_universe(sacn_merge_receiver_t handle, uint16_t *universe_id)
Get the universe on which a sACN Merge Receiver is currently listening.
Definition merge_receiver.c:278
etcpal_error_t sacn_merge_receiver_get_source(sacn_merge_receiver_t merge_receiver_handle, sacn_remote_source_t source_handle, SacnMergeReceiverSource *source_info)
Gets a copy of the information for the specified merge receiver source.
Definition merge_receiver.c:554
etcpal_error_t sacn_merge_receiver_change_universe(sacn_merge_receiver_t handle, uint16_t new_universe_id)
Change the universe on which a sACN Merge Receiver is listening.
Definition merge_receiver.c:320
etcpal_error_t sacn_merge_receiver_create(const SacnMergeReceiverConfig *config, sacn_merge_receiver_t *handle, const SacnNetintConfig *netint_config)
Create a new sACN Merge Receiver to listen and merge sACN data on a universe.
Definition merge_receiver.c:99
etcpal_error_t sacn_merge_receiver_change_universe_and_footprint(sacn_merge_receiver_t handle, uint16_t new_universe_id, const SacnRecvUniverseSubrange *new_footprint)
Change the universe and footprint on which an sACN merge receiver is listening.
Definition merge_receiver.c:401
int sacn_merge_receiver_t
A handle to an sACN Merge Receiver.
Definition merge_receiver.h:57
#define SACN_MERGE_RECEIVER_MAX_SLOTS
The maximum number of slots that can be merged by a single sACN Merge Receiver.
Definition merge_receiver.h:49
static const sacn_merge_receiver_t kSacnMergeReceiverInvalid
An invalid sACN Merge Receiver handle value.
Definition merge_receiver.h:59
@ kSacnReceiverInfiniteSources
Constant for "infinite" when listening or merging sACN universes.
Definition receiver.h:70
sACN Merge Receiver API definitions
A namespace which contains all C++ language definitions in the sACN library.
Definition common.h:50
McastMode
Determines whether multicast traffic is allowed through all interfaces or none.
Definition common.h:53
Information about a sACN source that was lost.
Definition receiver.h:153
A set of configuration information for an sACN merge receiver.
Definition merge_receiver.h:260
uint16_t universe_id
Universe number on which to listen for sACN.
Definition merge_receiver.h:264
Information about a remote sACN source being tracked by a merge receiver.
Definition merge_receiver.h:309
char name[kSacnSourceNameMaxLen]
The name of the source.
Definition merge_receiver.h:315
EtcPalUuid cid
The Component Identifier (CID) of the source.
Definition merge_receiver.h:313
uint8_t universe_priority
The source's current per-universe priority.
Definition merge_receiver.h:321
EtcPalSockAddr addr
The network address from which the most recent sACN packet originated.
Definition merge_receiver.h:317
bool per_address_priorities_active
Whether the source is sending per-address priority packets, or only per-universe.
Definition merge_receiver.h:319
sacn_remote_source_t handle
The handle of the source.
Definition merge_receiver.h:311
Network interface configuration information to give the sACN library.
Definition common.h:114
SacnMcastInterface * netints
An array of network interface IDs to which to restrict multicast traffic.
Definition common.h:117
size_t num_netints
Size of netints array.
Definition common.h:119
bool no_netints
If this is true, no network interfaces will be used for multicast.
Definition common.h:122
Newly updated merged data within the configured footprint.
Definition merge_receiver.h:65
A complete description of newly received universe data within the configured footprint.
Definition receiver.h:92
Defines a range of addresses within a sACN universe.
Definition receiver.h:83
Information about a remote sACN source being tracked by a receiver.
Definition receiver.h:142
A set of network interfaces for a particular merge receiver.
Definition merge_receiver.h:278
sacn_merge_receiver_t handle
The merge receiver's handle.
Definition merge_receiver.h:280
bool no_netints
If this is true, this merge receiver will not use any network interfaces for multicast traffic.
Definition merge_receiver.h:287
std::vector< SacnMcastInterface > netints
If !empty, this is the list of interfaces the application wants to use, and the status codes are fill...
Definition merge_receiver.h:284
NetintList()=default
Create an empty, invalid data structure by default.
A set of configuration settings that a merge receiver needs to initialize.
Definition merge_receiver.h:239
bool IsValid() const
Determine whether a MergeReciever Settings instance contains valid data for sACN operation.
Definition merge_receiver.h:453
uint16_t universe_id
The sACN universe number the merge receiver is listening to.
Definition merge_receiver.h:243
sacn_ip_support_t ip_supported
What IP networking the merge receiver will support.
Definition merge_receiver.h:260
int source_count_max
The maximum number of sources this universe will listen to when using dynamic memory.
Definition merge_receiver.h:251
SacnRecvUniverseSubrange footprint
The footprint within the universe to monitor.
Definition merge_receiver.h:248
bool use_pap
If true, this allows per-address priorities (if any are received) to be fed into the merger.
Definition merge_receiver.h:257
Settings()=default
Create an empty, invalid data structure by default.
Information about a remote sACN source being tracked by a merge receiver.
Definition merge_receiver.h:300
bool per_address_priorities_active
Whether the source is sending per-address priority packets, or only per-universe.
Definition merge_receiver.h:310
etcpal::Uuid cid
The Component Identifier (CID) of the source.
Definition merge_receiver.h:304
etcpal::SockAddr addr
The network address from which the most recent sACN packet originated.
Definition merge_receiver.h:308
sacn_remote_source_t handle
The handle of the source.
Definition merge_receiver.h:302
uint8_t universe_priority
The source's current per-universe priority.
Definition merge_receiver.h:312
std::string name
The name of the source.
Definition merge_receiver.h:306