diff --git a/src/ossia/detail/triple_buffer.hpp b/src/ossia/detail/triple_buffer.hpp index 79aa2e7c8d5..f944ec570f6 100644 --- a/src/ossia/detail/triple_buffer.hpp +++ b/src/ossia/detail/triple_buffer.hpp @@ -16,7 +16,7 @@ class triple_buffer std::atomic_flag stale; public: - triple_buffer(T init) + explicit triple_buffer(T init) { // Store the initial data in the "ready" buffer: data[1] = std::move(init); @@ -53,6 +53,8 @@ class triple_buffer res = std::move(*p); return true; } + + auto& get_data() noexcept { return this->data; } }; } diff --git a/src/ossia/network/common/device_parameter.hpp b/src/ossia/network/common/device_parameter.hpp index 6ee6d30bd2b..d735ab00298 100644 --- a/src/ossia/network/common/device_parameter.hpp +++ b/src/ossia/network/common/device_parameter.hpp @@ -1,4 +1,3 @@ - #pragma once #include @@ -13,7 +12,6 @@ namespace ossia::net class OSSIA_EXPORT device_parameter : public ossia::net::parameter_base { - public: device_parameter( ossia::net::node_base& node, const ossia::val_type type, diff --git a/src/ossia/network/common/device_parameter_t.hpp b/src/ossia/network/common/device_parameter_t.hpp new file mode 100644 index 00000000000..df5d32695a8 --- /dev/null +++ b/src/ossia/network/common/device_parameter_t.hpp @@ -0,0 +1,109 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace ossia::net +{ +template +class device_parameter_t : public ossia::net::parameter_base +{ +public: + explicit device_parameter_t(net::node_base& node) + : net::parameter_base{node} + , m_current_value{} + { + set_repetition_filter(repetition_filter::ON); + } + + ~device_parameter_t() = default; + + void device_value_change_event(const ossia::value& val) + { + if(val.valid()) + { + m_current_value = val; + get_protocol().push(*this); + } + } + + void pull_value() override { get_protocol().pull(*this); } + + ossia::value value() const override { return m_current_value; } + + net::parameter_base& push_value(const ossia::value& val) override + { + set_value(val); + get_protocol().push(*this); + return *this; + } + + net::parameter_base& push_value(ossia::value&& val) override + { + return push_value(val); + } + + net::parameter_base& push_value() override + { + get_protocol().push(*this); + return *this; + } + + ossia::value set_value(const ossia::value& val) override + { + if(val.valid()) + { + m_current_value = ossia::convert(val); + send(val); + device_update_value(); + } + + return m_current_value; + } + + ossia::value set_value(ossia::value&& val) override { return set_value(val); } + + ossia::val_type get_value_type() const noexcept override + { + return ossia::value_trait::ossia_enum; + } + + ossia::net::parameter_base& set_value_type(ossia::val_type) override { return *this; } + + ossia::access_mode get_access() const noexcept override + { + return ossia::access_mode::SET; + } + ossia::net::parameter_base& set_access(ossia::access_mode) override { return *this; } + + const domain& get_domain() const noexcept override + { + static const thread_local ossia::domain dom; + return dom; + } + + ossia::bounding_mode get_bounding() const noexcept override + { + return ossia::bounding_mode::CLIP; + } + ossia::net::parameter_base& set_bounding(ossia::bounding_mode) override + { + return *this; + } + + ossia::net::parameter_base& set_domain(const ossia::domain&) override { return *this; } + +protected: + virtual void device_update_value() + { + // Here should be the code that actually make the hardware update to + // current value + } + + T m_current_value; +}; +} diff --git a/src/ossia_sources.cmake b/src/ossia_sources.cmake index 104f78152e3..91793154df9 100644 --- a/src/ossia_sources.cmake +++ b/src/ossia_sources.cmake @@ -137,6 +137,7 @@ set(API_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/ossia/network/common/path.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/network/common/complex_type.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/network/common/device_parameter.hpp" + "${CMAKE_CURRENT_SOURCE_DIR}/ossia/network/common/device_parameter_t.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/network/generic/generic_parameter.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/network/generic/generic_device.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/ossia/network/generic/generic_node.hpp"