From e770c7a13877fb3d2a46880f70b20e2a9aaaad4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Micha=C3=ABl=20Celerier?= Date: Fri, 15 Mar 2024 11:51:54 -0400 Subject: [PATCH] [vst3] Work on OSC binding --- .../standalone/oscquery_minimal_mapper.hpp | 121 ++++++++++++++++++ include/avnd/binding/vst3/controller.hpp | 16 ++- 2 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 include/avnd/binding/standalone/oscquery_minimal_mapper.hpp diff --git a/include/avnd/binding/standalone/oscquery_minimal_mapper.hpp b/include/avnd/binding/standalone/oscquery_minimal_mapper.hpp new file mode 100644 index 00000000..906aa783 --- /dev/null +++ b/include/avnd/binding/standalone/oscquery_minimal_mapper.hpp @@ -0,0 +1,121 @@ +#pragma once + +/* SPDX-License-Identifier: GPL-3.0-or-later */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#if __has_include() +#include +#endif +namespace standalone +{ +template +struct oscquery_minimal_mapper +{ + using inputs_type = typename avnd::inputs_type::type; + std::shared_ptr m_context; + ossia::net::generic_device m_dev; + std::jthread m_thread; + + explicit oscquery_minimal_mapper(std::string name, int osc_port, int ws_port) + : m_context{std::make_shared()} + , m_dev{ + std::make_unique( + m_context), + name} + { + m_thread = std::jthread([this] (std::stop_token tk){ + std::this_thread::sleep_for(std::chrono::seconds(1)); + while(!tk.stop_requested()) + { + std::cerr << ("Starting...") << std::endl; + m_context->run(); + } + std::cerr << ("Exited") << std::endl; + }); + } + + ~oscquery_minimal_mapper() + { + std::cerr <<("oh shit"); + } + + template + requires(!avnd::enum_parameter) + void setup_control(Field& field, ossia::net::parameter_base& param) + { + std::cerr << ("Adding a control") << avnd::get_name() << std::endl; + param.set_value_type(oscr::type_for_arg()); + + // Set-up the metadata + if constexpr(avnd::parameter_with_minmax_range) + { + constexpr auto ctl = avnd::get_range(); + param.set_domain(ossia::make_domain(ctl.min, ctl.max)); + param.set_value(ctl.init); + } + + param.set_access(ossia::access_mode::BI); + + // Set-up the external callback + param.add_callback([&field](const ossia::value& val) { + oscr::from_ossia_value(field, val, field.value); + // FIXME callback into the origin + }); + } + + template + void setup_control(Field& field, ossia::net::parameter_base& param) + { + param.set_value_type(ossia::val_type::STRING); + + static constexpr const auto choices = avnd::get_enum_choices(); + static constexpr const auto choices_count = choices.size(); + ossia::domain_base dom{{choices.begin(), choices.end()}}; + // Set-up the metadata + param.set_value(dom.values[(int)avnd::get_range().init]); + param.set_domain(std::move(dom)); + param.set_access(ossia::access_mode::BI); + + // Set-up the external callback + param.add_callback([&field](const ossia::value& val) { + oscr::from_ossia_value(field, val, field.value); + }); + } + + template + void create_control(Field& field) + { + ossia::net::node_base& node = m_dev.get_root_node(); + std::string name{avnd::get_path(field)}; + + if(auto param + = ossia::net::create_parameter(node, name)) + { + setup_control(field, *param); + } + } + + void create_ports(typename avnd::inputs_type::type& inputs) + { + avnd::parameter_input_introspection::for_all(inputs, + [this](Field& f) { create_control(f); }); + } +}; +} diff --git a/include/avnd/binding/vst3/controller.hpp b/include/avnd/binding/vst3/controller.hpp index b09fbd3e..04fb71e5 100644 --- a/include/avnd/binding/vst3/controller.hpp +++ b/include/avnd/binding/vst3/controller.hpp @@ -14,6 +14,9 @@ #include +#if defined(AVND_ADD_OSCQUERY_BINDINGS) +#include +#endif namespace stv3 { template @@ -60,12 +63,22 @@ class Controller final using inputs_t = typename avnd::inputs_type::type; inputs_t inputs_mirror{}; +#undef AVND_ADD_OSCQUERY_BINDINGS +#if AVND_ADD_OSCQUERY_BINDINGS + standalone::oscquery_minimal_mapper oscquery_mapper{ + std::string(avnd::get_name()), 1234, 5678}; +#endif using inputs_info_t = avnd::parameter_input_introspection; static const constexpr int32_t parameter_count = inputs_info_t::size; public: - Controller() { } + Controller() + { +#if AVND_ADD_OSCQUERY_BINDINGS + oscquery_mapper.create_ports(inputs_mirror); +#endif + } virtual ~Controller(); @@ -170,7 +183,6 @@ class Controller final { bool ok = inputs_info_t::for_all_unless( this->inputs_mirror, [&](C& field) -> bool { - double param = 0.f; if(streamer.readDouble(param) == false) return false;