diff --git a/3rdparty/libossia b/3rdparty/libossia index 0fb5beb3a0..062cdfa696 160000 --- a/3rdparty/libossia +++ b/3rdparty/libossia @@ -1 +1 @@ -Subproject commit 0fb5beb3a0196781096314ac6b01973f191fbbf8 +Subproject commit 062cdfa69606374bc635874555a64a1be15ae5f1 diff --git a/src/plugins/score-plugin-avnd/Crousti/Executor.hpp b/src/plugins/score-plugin-avnd/Crousti/Executor.hpp index b862f03470..a8feec0008 100644 --- a/src/plugins/score-plugin-avnd/Crousti/Executor.hpp +++ b/src/plugins/score-plugin-avnd/Crousti/Executor.hpp @@ -34,6 +34,8 @@ #include +#include + #include #include @@ -598,56 +600,6 @@ struct ExecutorGuiUpdate } }; -template -struct type_if; -template -struct type_if -{ - type_if() = default; - type_if(const type_if&) = default; - type_if(type_if&&) = default; - type_if& operator=(const type_if&) = default; - type_if& operator=(type_if&&) = default; - - template - type_if(U&&) - { - } - template - T& operator=(U&& u) noexcept - { - return *this; - } -}; - -template -struct type_if -{ - [[no_unique_address]] T value; - - type_if() = default; - type_if(const type_if&) = default; - type_if(type_if&&) = default; - type_if& operator=(const type_if&) = default; - type_if& operator=(type_if&&) = default; - - template - type_if(U&& other) - : value{std::forward(other)} - { - } - - operator const T&() const noexcept { return value; } - operator T&() noexcept { return value; } - operator T&&() && noexcept { return std::move(value); } - - template - T& operator=(U&& u) noexcept - { - return value = std::forward(u); - } -}; - template class CustomNodeProcess : public ossia::node_process { @@ -683,7 +635,7 @@ class Executor final return static_key() == other || Execution::ProcessComponent::base_key_match(other); } - [[no_unique_address]] type_if> node_id = -1; + [[no_unique_address]] ossia::type_if> node_id = -1; Executor(ProcessModel& element, const ::Execution::Context& ctx, QObject* p) : Execution::ProcessComponent_T, ossia::node_process>{ diff --git a/src/plugins/score-plugin-avnd/Crousti/ProcessModel.hpp b/src/plugins/score-plugin-avnd/Crousti/ProcessModel.hpp index 71822739c2..2da47b6c53 100644 --- a/src/plugins/score-plugin-avnd/Crousti/ProcessModel.hpp +++ b/src/plugins/score-plugin-avnd/Crousti/ProcessModel.hpp @@ -5,11 +5,13 @@ #include #include +#include #include #include #include #include +#include #include #include @@ -78,8 +80,8 @@ class ProcessModel final [[no_unique_address]] oscr::dynamic_ports_storage dynamic_ports; - std::conditional_t, Info, char> - object_storage_for_ports_callbacks; + [[no_unique_address]] + ossia::type_if> object_storage_for_ports_callbacks; ProcessModel( const TimeVal& duration, const Id& id, QObject* parent) @@ -180,10 +182,10 @@ class ProcessModel final || avnd::dynamic_ports_output_introspection::size > 0) { avnd::control_input_introspection::for_all_n2( - avnd::get_inputs(this->object_storage_for_ports_callbacks), + avnd::get_inputs((Info&)this->object_storage_for_ports_callbacks), [this]( F& field, auto pred_index, avnd::field_index) { - auto& obj = this->object_storage_for_ports_callbacks; + Info& obj = this->object_storage_for_ports_callbacks; if constexpr(requires { F::on_controller_setup(); }) { auto controller_inlets = avnd_input_idx_to_model_ports(Idx); @@ -205,7 +207,7 @@ class ProcessModel final connect( inlet, &Process::ControlInlet::valueChanged, [this, &field](const ossia::value& val) { - auto& obj = this->object_storage_for_ports_callbacks; + Info& obj = this->object_storage_for_ports_callbacks; oscr::from_ossia_value(val, field.value); if_possible(field.update(obj)); @@ -214,6 +216,21 @@ class ProcessModel final }); } }); + + if constexpr(avnd::has_gui_to_processor_bus) + { + // FIXME needs to be a list of callbacks? + } + + if constexpr(avnd::has_processor_to_gui_bus) + { + Info& obj = this->object_storage_for_ports_callbacks; + + obj.send_message = [this](T&& b) mutable { + if(this->to_ui) + MessageBusSender{this->to_ui}(std::move(b)); + }; + } } } @@ -255,7 +272,7 @@ class ProcessModel final if constexpr(avnd::dynamic_ports_input_introspection::size > 0) { - auto& obj = object_storage_for_ports_callbacks; + Info& obj = object_storage_for_ports_callbacks; avnd::dynamic_ports_input_introspection::for_all_n2( avnd::get_inputs(obj), [&](auto& port, auto pred_idx, avnd::field_index field_idx) { @@ -274,7 +291,7 @@ class ProcessModel final if constexpr(avnd::dynamic_ports_output_introspection::size > 0) { - auto& obj = object_storage_for_ports_callbacks; + Info& obj = object_storage_for_ports_callbacks; avnd::dynamic_ports_output_introspection::for_all_n2( avnd::get_outputs(obj), [&](auto& port, auto pred_idx, avnd::field_index field_idx) {