Port update callback

Supported bindings: ossia

It is possible to get a callback whenever the value of a (value) input port gets updated, to perform complex actions. update will always be called before the current tick starts.

The port simply needs to have a void update(T&) { } method implemented, where T will be the object containing the port:

Example

struct MyProcessor
{
  static consteval auto name() { return "Addition"; }

  struct
  {
    struct { 
      static consteval auto name() { return "a"; } 
      void update(MyProcessor& proc) { /* called when 'a.value' changes */ }

      float value; 
    } a;
    struct { 
      static consteval auto name() { return "b"; } 
      void update(MyProcessor& proc) { /* called when 'b.value' changes */ }

      float value; 
    } b;
  } inputs;

  struct
  {
    struct { 
      static consteval auto name() { return "out"; } 
      float value; 
    } out;
  } outputs;

  void operator()() { outputs.out.value = inputs.a.value + inputs.b.value; }
};

Usage with helpers

To add an update method to an helper, simply inherit from them:

#pragma once
#include <halp/controls.hpp>

struct MyProcessor
{
  halp_meta(name, "Addition")

  struct
  {
    struct : halp::val_port<"a", float> { 
      void update(MyProcessor& proc) { /* called when 'a.value' changes */ }
    } a;

    halp::val_port<"b", float> b;
  } inputs;

  struct
  {
    halp::val_port<"out", float> out;
  } outputs;

  void operator()() { outputs.out = inputs.a + inputs.b; }
};