2 #include <ossia/dataflow/audio_port.hpp>
3 #include <ossia/dataflow/dataflow_fwd.hpp>
4 #include <ossia/dataflow/geometry_port.hpp>
5 #include <ossia/dataflow/midi_port.hpp>
6 #include <ossia/dataflow/value_port.hpp>
8 #include <ossia/network/common/path.hpp>
12 struct OSSIA_EXPORT port
14 enum scope_t : uint8_t
22 scope_t scope{scope_t::both};
26 port(
const port&) =
delete;
27 port(port&&) =
delete;
28 port& operator=(
const port&) =
delete;
29 port& operator=(port&&) =
delete;
33 struct OSSIA_EXPORT inlet :
public port
36 inlet() noexcept = default;
38 inlet(destination_t dest) noexcept
39 : address{std::move(dest)}
48 inlet(graph_edge& edge) noexcept { sources.push_back(&edge); }
53 void connect(graph_edge* e) noexcept
55 auto it = ossia::find(sources, e);
56 if(it == sources.end())
60 void disconnect(graph_edge* e) noexcept { ossia::remove_erase(sources, e); }
62 [[nodiscard]]
virtual std::size_t which() const noexcept = 0;
67 const T* target() const noexcept;
71 const T& cast() const noexcept;
73 auto visit(const T& t);
75 auto visit(const T& t) const;
77 auto& cables() noexcept {
return sources; }
78 [[nodiscard]]
auto& cables() const noexcept {
return sources; }
80 virtual void pre_process();
81 virtual void post_process();
83 destination_t address;
84 ossia::small_vector<graph_edge*, 2> sources;
85 ossia::small_vector<value_inlet*, 2> child_inlets;
87 friend struct audio_inlet;
88 friend struct value_inlet;
89 friend struct midi_inlet;
92 struct OSSIA_EXPORT outlet :
public port
95 outlet() noexcept = default;
96 outlet(destination_t dest) noexcept
97 : address{std::move(dest)}
106 outlet(graph_edge& edge) noexcept { targets.push_back(&edge); }
111 void connect(graph_edge* e) noexcept
113 auto it = ossia::find(targets, e);
114 if(it == targets.end())
115 targets.push_back(e);
118 void disconnect(graph_edge* e) noexcept { ossia::remove_erase(targets, e); }
120 void write(execution_state& e);
122 [[nodiscard]]
virtual std::size_t which() const noexcept = 0;
124 template <typename T>
125 T* target() noexcept;
126 template <typename T>
127 const T* target() const noexcept;
128 template <typename T>
130 template <typename T>
131 const T& cast() const noexcept;
132 template <typename T>
133 auto visit(const T& t);
134 template <typename T>
135 auto visit(const T& t) const;
137 virtual
void pre_process();
138 virtual
void post_process();
140 auto& cables() noexcept {
return targets; }
141 [[nodiscard]]
auto& cables() const noexcept {
return targets; }
143 destination_t address;
144 ossia::small_vector<graph_edge*, 2> targets;
145 ossia::small_vector<value_inlet*, 2> child_inlets;
147 friend struct audio_outlet;
148 friend struct value_outlet;
149 friend struct midi_outlet;
152 struct OSSIA_EXPORT audio_inlet :
public ossia::inlet
154 audio_inlet() noexcept = default;
156 audio_inlet(destination_t dest) noexcept
157 : inlet{std::move(dest)}
166 audio_inlet(graph_edge& edge) noexcept { sources.push_back(&edge); }
170 const ossia::audio_port& operator*() const noexcept {
return data; }
171 const ossia::audio_port* operator->() const noexcept {
return &data; }
172 ossia::audio_port& operator*() noexcept {
return data; }
173 ossia::audio_port* operator->() noexcept {
return &data; }
175 [[nodiscard]] std::size_t which() const noexcept final
override
177 return audio_port::which;
180 ossia::audio_port data;
183 struct OSSIA_EXPORT midi_inlet :
public ossia::inlet
185 midi_inlet() noexcept = default;
187 midi_inlet(destination_t dest) noexcept
188 : inlet{std::move(dest)}
197 midi_inlet(graph_edge& edge) noexcept { sources.push_back(&edge); }
201 const ossia::midi_port& operator*() const noexcept {
return data; }
202 const ossia::midi_port* operator->() const noexcept {
return &data; }
203 ossia::midi_port& operator*() noexcept {
return data; }
204 ossia::midi_port* operator->() noexcept {
return &data; }
206 [[nodiscard]] std::size_t which() const noexcept final
override
208 return midi_port::which;
211 ossia::midi_port data;
214 struct OSSIA_EXPORT value_inlet :
public ossia::inlet
216 value_inlet() noexcept = default;
218 value_inlet(destination_t dest) noexcept
219 : inlet{std::move(dest)}
228 value_inlet(graph_edge& edge) noexcept { sources.push_back(&edge); }
232 const ossia::value_port& operator*() const noexcept {
return data; }
233 const ossia::value_port* operator->() const noexcept {
return &data; }
234 ossia::value_port& operator*() noexcept {
return data; }
235 ossia::value_port* operator->() noexcept {
return &data; }
237 [[nodiscard]] std::size_t which() const noexcept final
override
239 return value_port::which;
242 ossia::value_port data;
248 void process_audio_out_mono(ossia::audio_outlet& audio_out);
251 void process_audio_out_general(ossia::audio_outlet& audio_out);
254 void process_audio_out_mono(ossia::audio_port& i, ossia::audio_outlet& audio_out);
257 void process_audio_out_general(ossia::audio_port& i, ossia::audio_outlet& audio_out);
259 struct OSSIA_EXPORT audio_outlet :
public ossia::outlet
261 audio_outlet() noexcept { init(); }
263 audio_outlet(destination_t dest) noexcept
264 : outlet{std::move(dest)}
275 audio_outlet(graph_edge& edge) noexcept
277 targets.push_back(&edge);
283 const ossia::audio_port& operator*() const noexcept {
return data; }
284 const ossia::audio_port* operator->() const noexcept {
return &data; }
285 ossia::audio_port& operator*() noexcept {
return data; }
286 ossia::audio_port* operator->() noexcept {
return &data; }
288 [[nodiscard]] std::size_t which() const noexcept final
override
290 return audio_port::which;
293 void post_process()
override;
296 pan_weight pan{1., 1.};
298 ossia::value_inlet gain_inlet;
299 ossia::value_inlet pan_inlet;
301 ossia::audio_port data;
307 this->child_inlets.resize(2);
308 this->child_inlets[0] = &gain_inlet;
309 this->child_inlets[1] = &pan_inlet;
313 #if BOOST_VERSION >= 107200
314 static_assert(noexcept(pan_weight{}));
315 static_assert(noexcept(value_inlet{}));
316 static_assert(noexcept(std::allocator<ossia::outlet>{}));
317 static_assert(noexcept(audio_outlet{}));
320 struct OSSIA_EXPORT midi_outlet :
public ossia::outlet
322 midi_outlet() noexcept = default;
324 midi_outlet(destination_t dest) noexcept
325 : outlet{std::move(dest)}
334 midi_outlet(graph_edge& edge) noexcept { targets.push_back(&edge); }
337 const ossia::midi_port& operator*() const noexcept {
return data; }
338 const ossia::midi_port* operator->() const noexcept {
return &data; }
339 ossia::midi_port& operator*() noexcept {
return data; }
340 ossia::midi_port* operator->() noexcept {
return &data; }
342 [[nodiscard]] std::size_t which() const noexcept final
override
344 return midi_port::which;
347 ossia::midi_port data;
350 struct OSSIA_EXPORT value_outlet :
public ossia::outlet
352 value_outlet() noexcept = default;
354 value_outlet(destination_t dest) noexcept
355 : outlet{std::move(dest)}
364 value_outlet(graph_edge& edge) noexcept { targets.push_back(&edge); }
367 const ossia::value_port& operator*() const noexcept {
return data; }
368 const ossia::value_port* operator->() const noexcept {
return &data; }
369 ossia::value_port& operator*() noexcept {
return data; }
370 ossia::value_port* operator->() noexcept {
return &data; }
372 [[nodiscard]] std::size_t which() const noexcept final
override
374 return value_port::which;
377 ossia::value_port data;
382 static const constexpr
int which = 3;
385 struct OSSIA_EXPORT texture_inlet :
public ossia::inlet
387 texture_inlet() noexcept = default;
389 texture_inlet(destination_t dest) noexcept
390 : inlet{std::move(dest)}
399 texture_inlet(graph_edge& edge) noexcept { sources.push_back(&edge); }
403 [[nodiscard]] std::size_t which() const noexcept final
override
405 return texture_port::which;
409 struct OSSIA_EXPORT texture_outlet :
public ossia::outlet
411 texture_outlet() noexcept = default;
413 texture_outlet(destination_t dest) noexcept
414 : outlet{std::move(dest)}
423 texture_outlet(graph_edge& edge) noexcept { targets.push_back(&edge); }
426 [[nodiscard]] std::size_t which() const noexcept final
override
428 return texture_port::which;
432 struct OSSIA_EXPORT geometry_inlet :
public ossia::inlet
434 geometry_inlet() noexcept = default;
436 geometry_inlet(destination_t dest) noexcept
437 : inlet{std::move(dest)}
446 geometry_inlet(graph_edge& edge) noexcept { sources.push_back(&edge); }
450 [[nodiscard]] std::size_t which() const noexcept final
override
452 return geometry_port::which;
458 struct OSSIA_EXPORT geometry_outlet :
public ossia::outlet
460 geometry_outlet() noexcept = default;
462 geometry_outlet(destination_t dest) noexcept
463 : outlet{std::move(dest)}
472 geometry_outlet(graph_edge& edge) noexcept { targets.push_back(&edge); }
475 [[nodiscard]] std::size_t which() const noexcept final
override
477 return geometry_port::which;
483 template <
typename T>
484 inline T* inlet::target() noexcept
486 if constexpr(std::is_same_v<T, audio_port>)
490 return &
static_cast<audio_inlet*
>(
this)->data;
494 return (audio_port*)
nullptr;
497 else if constexpr(std::is_same_v<T, midi_port>)
501 return &
static_cast<midi_inlet*
>(
this)->data;
505 return (midi_port*)
nullptr;
508 else if constexpr(std::is_same_v<T, value_port>)
512 return &
static_cast<value_inlet*
>(
this)->data;
516 return (value_port*)
nullptr;
519 else if constexpr(std::is_same_v<T, texture_inlet>)
523 return static_cast<texture_inlet*
>(
this);
527 return (texture_inlet*)
nullptr;
530 else if constexpr(std::is_same_v<T, geometry_port>)
534 return static_cast<geometry_inlet*
>(
this)->data;
538 return (geometry_port*)
nullptr;
543 static_assert(std::is_same_v<T, struct _>,
"Invalid type requested");
547 template <
typename T>
548 inline T* outlet::target() noexcept
550 if constexpr(std::is_same_v<T, audio_port>)
554 return &
static_cast<audio_outlet*
>(
this)->data;
558 return (audio_port*)
nullptr;
561 else if constexpr(std::is_same_v<T, midi_port>)
565 return &
static_cast<midi_outlet*
>(
this)->data;
569 return (midi_port*)
nullptr;
572 else if constexpr(std::is_same_v<T, value_port>)
576 return &
static_cast<value_outlet*
>(
this)->data;
580 return (value_port*)
nullptr;
583 else if constexpr(std::is_same_v<T, texture_outlet>)
587 return static_cast<texture_outlet*
>(
this);
591 return (texture_outlet*)
nullptr;
594 else if constexpr(std::is_same_v<T, geometry_port>)
598 return static_cast<geometry_outlet*
>(
this)->data;
602 return (geometry_port*)
nullptr;
607 static_assert(std::is_same_v<T, struct _>,
"Invalid type requested");
610 template <
typename T>
611 inline const T* inlet::target() const noexcept
613 if constexpr(std::is_same_v<T, audio_port>)
617 return &
static_cast<const audio_inlet*
>(
this)->data;
621 return (
const audio_port*)
nullptr;
624 else if constexpr(std::is_same_v<T, midi_port>)
628 return &
static_cast<const midi_inlet*
>(
this)->data;
632 return (
const midi_port*)
nullptr;
635 else if constexpr(std::is_same_v<T, value_port>)
639 return &
static_cast<const value_inlet*
>(
this)->data;
643 return (
const value_port*)
nullptr;
646 else if constexpr(std::is_same_v<T, texture_inlet>)
650 return static_cast<const texture_inlet*
>(
this);
654 return (
const texture_inlet*)
nullptr;
657 else if constexpr(std::is_same_v<T, geometry_port>)
661 return &
static_cast<const geometry_inlet*
>(
this)->data;
665 return (
const geometry_port*)
nullptr;
670 static_assert(std::is_same_v<T, struct _>,
"Invalid type requested");
674 template <
typename T>
675 inline const T* outlet::target() const noexcept
677 if constexpr(std::is_same_v<T, audio_port>)
681 return &
static_cast<const audio_outlet*
>(
this)->data;
685 return (
const audio_port*)
nullptr;
688 else if constexpr(std::is_same_v<T, midi_port>)
692 return &
static_cast<const midi_outlet*
>(
this)->data;
696 return (
const midi_port*)
nullptr;
699 else if constexpr(std::is_same_v<T, value_port>)
703 return &
static_cast<const value_outlet*
>(
this)->data;
707 return (
const value_port*)
nullptr;
710 else if constexpr(std::is_same_v<T, texture_outlet>)
714 return static_cast<const texture_outlet*
>(
this);
718 return (
const texture_outlet*)
nullptr;
721 else if constexpr(std::is_same_v<T, geometry_port>)
725 return &
static_cast<const geometry_outlet*
>(
this)->data;
729 return (
const geometry_port*)
nullptr;
734 static_assert(std::is_same_v<T, struct _>,
"Invalid type requested");
738 template <
typename T>
739 inline T& inlet::cast() noexcept
741 if constexpr(std::is_same_v<T, audio_port>)
743 return static_cast<audio_inlet*
>(
this)->data;
745 else if constexpr(std::is_same_v<T, midi_port>)
747 return static_cast<midi_inlet*
>(
this)->data;
749 else if constexpr(std::is_same_v<T, value_port>)
751 return static_cast<value_inlet*
>(
this)->data;
753 else if constexpr(std::is_same_v<T, texture_inlet>)
755 return static_cast<texture_inlet&
>(*this);
757 else if constexpr(std::is_same_v<T, geometry_port>)
759 return static_cast<geometry_inlet*
>(
this)->data;
763 static_assert(std::is_same_v<T, struct _>,
"Invalid type requested");
767 template <
typename T>
768 inline T& outlet::cast() noexcept
770 if constexpr(std::is_same_v<T, audio_port>)
772 return static_cast<audio_outlet*
>(
this)->data;
774 else if constexpr(std::is_same_v<T, midi_port>)
776 return static_cast<midi_outlet*
>(
this)->data;
778 else if constexpr(std::is_same_v<T, value_port>)
780 return static_cast<value_outlet*
>(
this)->data;
782 else if constexpr(std::is_same_v<T, texture_outlet>)
784 return static_cast<texture_outlet&
>(*this);
786 else if constexpr(std::is_same_v<T, geometry_port>)
788 return static_cast<geometry_outlet*
>(
this)->data;
792 static_assert(std::is_same_v<T, struct _>,
"Invalid type requested");
795 template <
typename T>
796 inline const T& inlet::cast() const noexcept
798 if constexpr(std::is_same_v<T, audio_port>)
800 return static_cast<const audio_inlet*
>(
this)->data;
802 else if constexpr(std::is_same_v<T, midi_port>)
804 return static_cast<const midi_inlet*
>(
this)->data;
806 else if constexpr(std::is_same_v<T, value_port>)
808 return static_cast<const value_inlet*
>(
this)->data;
810 else if constexpr(std::is_same_v<T, texture_inlet>)
812 return static_cast<const texture_inlet&
>(*this);
814 else if constexpr(std::is_same_v<T, geometry_port>)
816 return static_cast<const geometry_inlet*
>(
this)->data;
820 static_assert(std::is_same_v<T, struct _>,
"Invalid type requested");
824 template <
typename T>
825 inline const T& outlet::cast() const noexcept
827 if constexpr(std::is_same_v<T, audio_port>)
829 return static_cast<const audio_outlet*
>(
this)->data;
831 else if constexpr(std::is_same_v<T, midi_port>)
833 return static_cast<const midi_outlet*
>(
this)->data;
835 else if constexpr(std::is_same_v<T, value_port>)
837 return static_cast<const value_outlet*
>(
this)->data;
839 else if constexpr(std::is_same_v<T, texture_outlet>)
841 return static_cast<const texture_outlet&
>(*this);
843 else if constexpr(std::is_same_v<T, geometry_port>)
845 return static_cast<const geometry_outlet*
>(
this)->data;
849 static_assert(std::is_same_v<T, struct _>,
"Invalid type requested");
853 template <
typename T>
854 inline auto inlet::visit(
const T& t)
859 return t(
static_cast<audio_inlet*
>(
this)->data);
861 return t(
static_cast<midi_inlet*
>(
this)->data);
863 return t(
static_cast<value_inlet*
>(
this)->data);
866 return t(
static_cast<geometry_inlet*
>(
this)->data);
869 if constexpr(std::is_invocable_v<T>)
873 template <
typename T>
874 inline auto outlet::visit(
const T& t)
879 return t(
static_cast<audio_outlet*
>(
this)->data);
881 return t(
static_cast<midi_outlet*
>(
this)->data);
883 return t(
static_cast<value_outlet*
>(
this)->data);
886 return t(
static_cast<geometry_outlet*
>(
this)->data);
889 if constexpr(std::is_invocable_v<T>)
892 template <
typename T>
893 inline auto inlet::visit(
const T& t)
const
898 return t(
static_cast<const audio_inlet*
>(
this)->data);
900 return t(
static_cast<const midi_inlet*
>(
this)->data);
902 return t(
static_cast<const value_inlet*
>(
this)->data);
905 return t(
static_cast<const geometry_inlet*
>(
this)->data);
908 if constexpr(std::is_invocable_v<T>)
911 template <
typename T>
912 inline auto outlet::visit(
const T& t)
const
917 return t(
static_cast<const audio_outlet*
>(
this)->data);
919 return t(
static_cast<const midi_outlet*
>(
this)->data);
921 return t(
static_cast<const value_outlet*
>(
this)->data);
924 return t(
static_cast<const geometry_outlet*
>(
this)->data);
927 if constexpr(std::is_invocable_v<T>)
The parameter_base class.
Definition: ossia/network/base/parameter.hpp:48