sACN  3.0.0
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 DmxMerger(const DmxMerger& other) = delete;
131 DmxMerger& operator=(const DmxMerger& other) = delete;
132 DmxMerger(DmxMerger&& other) = default;
133 DmxMerger& operator=(DmxMerger&& other) = default;
135 etcpal::Error Startup(const Settings& settings);
136 void Shutdown();
137
141
142 etcpal::Error UpdateLevels(sacn_dmx_merger_source_t source, const uint8_t* new_levels, size_t new_levels_count);
143 etcpal::Error UpdatePap(sacn_dmx_merger_source_t source, const uint8_t* pap, size_t pap_count);
144 etcpal::Error UpdateUniversePriority(sacn_dmx_merger_source_t source, uint8_t universe_priority);
146
147 constexpr Handle handle() const;
148
149private:
150 SacnDmxMergerConfig TranslateConfig(const Settings& settings);
151
152 Handle handle_;
153};
154
160inline DmxMerger::Settings::Settings(uint8_t* levels_ptr) : levels(levels_ptr)
161{
162}
163
168{
169 return (levels != nullptr);
170}
171
186{
187 SacnDmxMergerConfig config = TranslateConfig(settings);
188
190 etcpal::Error result = sacn_dmx_merger_create(&config, &c_handle);
191
192 handle_.SetValue(c_handle);
193
194 return result;
195}
196
208{
210 handle_.Clear();
211}
212
229{
231 etcpal_error_t err = sacn_dmx_merger_add_source(handle_.value(), &result);
232 if (err == kEtcPalErrOk)
233 return result;
234 else
235 return err;
236}
237
253
265{
266 return sacn_dmx_merger_get_source(handle_.value(), source);
267}
268
289inline etcpal::Error DmxMerger::UpdateLevels(sacn_dmx_merger_source_t source, const uint8_t* new_levels,
290 size_t new_levels_count)
291{
292 return sacn_dmx_merger_update_levels(handle_.value(), source, new_levels, new_levels_count);
293}
294
315inline etcpal::Error DmxMerger::UpdatePap(sacn_dmx_merger_source_t source, const uint8_t* pap, size_t pap_count)
316{
317 return sacn_dmx_merger_update_pap(handle_.value(), source, pap, pap_count);
318}
319
344{
345 return sacn_dmx_merger_update_universe_priority(handle_.value(), source, universe_priority);
346}
347
366
372inline constexpr DmxMerger::Handle DmxMerger::handle() const
373{
374 return handle_;
375}
376
377inline SacnDmxMergerConfig DmxMerger::TranslateConfig(const Settings& settings)
378{
379 // clang-format off
380 SacnDmxMergerConfig config = {
381 settings.levels,
382 settings.per_address_priorities,
383 settings.per_address_priorities_active,
384 settings.universe_priority,
385 settings.owners,
386 settings.source_count_max
387 };
388 // clang-format on
389
390 return config;
391}
392
393}; // namespace sacn
394
395#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
DmxMerger(DmxMerger &&other)=default
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:289
const SacnDmxMergerSource * GetSourceInfo(sacn_dmx_merger_source_t source) const
Gets a read-only view of the source data.
Definition dmx_merger.h:264
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:315
constexpr Handle handle() const
Get the current handle to the underlying C DMX merger.
Definition dmx_merger.h:372
etcpal::Error RemoveSource(sacn_dmx_merger_source_t source)
Removes a source from the merger.
Definition dmx_merger.h:249
etcpal::Error Startup(const Settings &settings)
Create a new merger instance.
Definition dmx_merger.h:185
DmxMerger & operator=(DmxMerger &&other)=default
etcpal::Expected< sacn_dmx_merger_source_t > AddSource()
Adds a new source to the merger.
Definition dmx_merger.h:228
void Shutdown()
Destroy a merger instance.
Definition dmx_merger.h:207
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:343
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:362
Definition dmx_merger.h:45
C++ wrapper for the sACN init/deinit functions.
sACN DMX Merger API definitions
etcpal_error_t
kEtcPalErrOk
#define SACN_DMX_MERGER_SOURCE_INVALID
Definition dmx_merger.h:75
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:359
#define SACN_DMX_MERGER_INVALID
Definition dmx_merger.h:68
etcpal_error_t sacn_dmx_merger_destroy(sacn_dmx_merger_t handle)
Destroy a merger instance.
Definition dmx_merger.c:227
uint16_t sacn_dmx_merger_source_t
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:403
etcpal_error_t sacn_dmx_merger_create(const SacnDmxMergerConfig *config, sacn_dmx_merger_t *handle)
Create a new merger instance.
Definition dmx_merger.c:172
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:522
int sacn_dmx_merger_t
Definition dmx_merger.h:65
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:461
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:317
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:567
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:275
#define SACN_RECEIVER_INFINITE_SOURCES
Constant for "infinite" when listening or merging sACN universes.
Definition receiver.h:68
A namespace which contains all C++ language definitions in the sACN library.
Definition common.h:50
Definition dmx_merger.h:79
uint8_t * levels
Definition dmx_merger.h:85
Definition dmx_merger.h:149
A set of configuration settings that a merger needs to initialize.
Definition dmx_merger.h:77
uint8_t * levels
Definition dmx_merger.h:83
uint8_t * per_address_priorities
Definition dmx_merger.h:91
int source_count_max
Definition dmx_merger.h:114
bool * per_address_priorities_active
Definition dmx_merger.h:97
bool IsValid() const
Definition dmx_merger.h:167
uint8_t * universe_priority
Definition dmx_merger.h:103
sacn_dmx_merger_source_t * owners
Definition dmx_merger.h:112