sACN  HEAD (unstable)
Implementation of ANSI E1.31 (Streaming ACN)
View other versions:
Loading...
Searching...
No Matches
dmx_merger.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_DMX_MERGER_H_
21#define SACN_CPP_DMX_MERGER_H_
22
28#include "sacn/cpp/common.h"
29
30#include "sacn/dmx_merger.h"
31#include "etcpal/cpp/inet.h"
33
40namespace sacn
41{
42namespace detail
43{
45{
46};
47}; // namespace detail
48
67{
68public:
71
76 struct Settings
77 {
83 uint8_t* levels{nullptr};
84
91 uint8_t* per_address_priorities{nullptr};
92
98
103 uint8_t* universe_priority{nullptr};
104
113
118 Settings() = default;
119
124 Settings(uint8_t* levels_ptr);
125
126 bool IsValid() const;
127 };
128
129 DmxMerger() = default;
130 virtual ~DmxMerger() = default;
131
132 DmxMerger(const DmxMerger& other) = delete;
133 DmxMerger& operator=(const DmxMerger& other) = delete;
134 DmxMerger(DmxMerger&& other) = default;
135 DmxMerger& operator=(DmxMerger&& other) = default;
137 etcpal::Error Startup(const Settings& settings);
138 void Shutdown();
139
143
144 etcpal::Error UpdateLevels(sacn_dmx_merger_source_t source, const uint8_t* new_levels, size_t new_levels_count);
145 etcpal::Error UpdatePap(sacn_dmx_merger_source_t source, const uint8_t* pap, size_t pap_count);
146 etcpal::Error UpdateUniversePriority(sacn_dmx_merger_source_t source, uint8_t universe_priority);
148
149 constexpr Handle handle() const;
150
151private:
152 static SacnDmxMergerConfig TranslateConfig(const Settings& settings);
153
154 Handle handle_;
155};
156
162inline DmxMerger::Settings::Settings(uint8_t* levels_ptr) : levels(levels_ptr)
163{
164}
165
170{
171 return (levels != nullptr);
172}
173
188{
189 SacnDmxMergerConfig config = TranslateConfig(settings);
190
192 etcpal::Error result = sacn_dmx_merger_create(&config, &c_handle);
193
194 handle_.SetValue(c_handle);
195
196 return result;
197}
198
205{
207 handle_.Clear();
208}
209
226{
228 etcpal_error_t err = sacn_dmx_merger_add_source(handle_.value(), &result);
229 if (err == kEtcPalErrOk)
230 return result;
231
232 return err;
233}
234
250
262{
263 return sacn_dmx_merger_get_source(handle_.value(), source);
264}
265
287 const uint8_t* new_levels,
288 size_t new_levels_count)
289{
290 return sacn_dmx_merger_update_levels(handle_.value(), source, new_levels, new_levels_count);
291}
292
313inline etcpal::Error DmxMerger::UpdatePap(sacn_dmx_merger_source_t source, const uint8_t* pap, size_t pap_count)
314{
315 return sacn_dmx_merger_update_pap(handle_.value(), source, pap, pap_count);
316}
317
342{
343 return sacn_dmx_merger_update_universe_priority(handle_.value(), source, universe_priority);
344}
345
364
371{
372 return handle_;
373}
374
375inline SacnDmxMergerConfig DmxMerger::TranslateConfig(const Settings& settings)
376{
377 // clang-format off
378 SacnDmxMergerConfig config = {
379 settings.levels,
380 settings.per_address_priorities,
381 settings.per_address_priorities_active,
382 settings.universe_priority,
383 settings.owners,
384 settings.source_count_max
385 };
386 // clang-format on
387
388 return config;
389}
390
391}; // namespace sacn
392
393#endif // SACN_CPP_DMX_MERGER_H_
ETCPAL_CONSTEXPR_14 void Clear()
ETCPAL_CONSTEXPR_14 void SetValue(const ValueType &new_value)
constexpr ValueType value() const
An instance of sACN DMX Merger functionality; see Using the sACN DMX Merger API.
Definition dmx_merger.h:67
const SacnDmxMergerSource * GetSourceInfo(sacn_dmx_merger_source_t source) const
Gets a read-only view of the source data.
Definition dmx_merger.h:261
DmxMerger(DmxMerger &&other)=default
Move a dmx merger instance.
etcpal::Error UpdateUniversePriority(sacn_dmx_merger_source_t source, uint8_t universe_priority)
Updates a source's universe priority and recalculates outputs.
Definition dmx_merger.h:341
etcpal::Error UpdatePap(sacn_dmx_merger_source_t source, const uint8_t *pap, size_t pap_count)
Updates a source's per-address priorities (PAP) and recalculates outputs.
Definition dmx_merger.h:313
constexpr Handle handle() const
Get the current handle to the underlying C DMX merger.
Definition dmx_merger.h:370
etcpal::Error UpdateLevels(sacn_dmx_merger_source_t source, const uint8_t *new_levels, size_t new_levels_count)
Updates a source's levels and recalculates outputs.
Definition dmx_merger.h:286
void Shutdown()
Destroy a merger instance.
Definition dmx_merger.h:204
etcpal::Error Startup(const Settings &settings)
Create a new merger instance.
Definition dmx_merger.h:187
etcpal::Expected< sacn_dmx_merger_source_t > AddSource()
Adds a new source to the merger.
Definition dmx_merger.h:225
etcpal::Error RemoveSource(sacn_dmx_merger_source_t source)
Removes a source from the merger.
Definition dmx_merger.h:246
etcpal::Error RemovePap(sacn_dmx_merger_source_t source)
Removes the per-address priority (PAP) data from the source and recalculate outputs.
Definition dmx_merger.h:360
DmxMerger & operator=(DmxMerger &&other)=default
Move a dmx merger instance.
Definition dmx_merger.h:45
C++ wrapper for the sACN init/deinit functions.
sACN DMX Merger API definitions
etcpal_error_t
kEtcPalErrOk
const SacnDmxMergerSource * sacn_dmx_merger_get_source(sacn_dmx_merger_t merger, sacn_dmx_merger_source_t source)
Gets a read-only view of the source data.
Definition dmx_merger.c:390
etcpal_error_t sacn_dmx_merger_destroy(sacn_dmx_merger_t handle)
Destroy a merger instance.
Definition dmx_merger.c:258
uint16_t sacn_dmx_merger_source_t
A source handle used by the DMX merger, could represent a remote source or another logical source (e....
Definition dmx_merger.h:72
etcpal_error_t sacn_dmx_merger_update_levels(sacn_dmx_merger_t merger, sacn_dmx_merger_source_t source, const uint8_t *new_levels, size_t new_levels_count)
Updates a source's levels and recalculates outputs.
Definition dmx_merger.c:434
etcpal_error_t sacn_dmx_merger_create(const SacnDmxMergerConfig *config, sacn_dmx_merger_t *handle)
Create a new merger instance.
Definition dmx_merger.c:203
static const sacn_dmx_merger_t kSacnDmxMergerInvalid
An invalid sACN merger handle value.
Definition dmx_merger.h:68
etcpal_error_t sacn_dmx_merger_update_universe_priority(sacn_dmx_merger_t merger, sacn_dmx_merger_source_t source, uint8_t universe_priority)
Updates a source's universe priority and recalculates outputs.
Definition dmx_merger.c:557
int sacn_dmx_merger_t
Each merger has a handle associated with it.
Definition dmx_merger.h:66
etcpal_error_t sacn_dmx_merger_update_pap(sacn_dmx_merger_t merger, sacn_dmx_merger_source_t source, const uint8_t *pap, size_t pap_count)
Updates a source's per-address priorities (PAP) and recalculates outputs.
Definition dmx_merger.c:494
etcpal_error_t sacn_dmx_merger_remove_source(sacn_dmx_merger_t merger, sacn_dmx_merger_source_t source)
Removes a source from the merger.
Definition dmx_merger.c:348
etcpal_error_t sacn_dmx_merger_remove_pap(sacn_dmx_merger_t merger, sacn_dmx_merger_source_t source)
Removes the per-address priority (PAP) data from the source and recalculate outputs.
Definition dmx_merger.c:603
static const sacn_dmx_merger_source_t kSacnDmxMergerSourceInvalid
An invalid DMX merger source handle value.
Definition dmx_merger.h:74
etcpal_error_t sacn_dmx_merger_add_source(sacn_dmx_merger_t merger, sacn_dmx_merger_source_t *source_id)
Adds a new source to the merger.
Definition dmx_merger.c:306
@ kSacnReceiverInfiniteSources
Constant for "infinite" when listening or merging sACN universes.
Definition receiver.h:70
A namespace which contains all C++ language definitions in the sACN library.
Definition common.h:50
A set of configuration information for a merger instance.
Definition dmx_merger.h:78
uint8_t * levels
This is always required to be non-NULL.
Definition dmx_merger.h:84
The current input data for a single source of the merge.
Definition dmx_merger.h:145
A set of configuration settings that a merger needs to initialize.
Definition dmx_merger.h:77
uint8_t * per_address_priorities
This is only allowed to be NULL if and only if SACN_DMX_MERGER_DISABLE_INTERNAL_PAP_BUFFER is 0.
Definition dmx_merger.h:91
bool IsValid() const
Determine whether a DmxMerger Settings instance contains valid data for sACN operation.
Definition dmx_merger.h:169
Settings()=default
Create an empty, invalid data structure by default.
bool * per_address_priorities_active
This is allowed to be NULL.
Definition dmx_merger.h:97
uint8_t * universe_priority
This is allowed to be NULL.
Definition dmx_merger.h:103
uint8_t * levels
This is always required to be non-NULL.
Definition dmx_merger.h:83
sacn_dmx_merger_source_t * owners
This is only allowed to be NULL if and only if SACN_DMX_MERGER_DISABLE_INTERNAL_OWNER_BUFFER is 0.
Definition dmx_merger.h:112
int source_count_max
The maximum number of sources this universe will listen to when using dynamic memory.
Definition dmx_merger.h:114