Feature injection

Many processors may require some kind of common, cross-cutting algorithm or system for their proper operation.

Processors can optionally declare a template argument, which will contain the implementations of these "cross-cutting concerns" supported by the backend.

For now, there are two:

  • A logging system
  • An 1D FFT
template<typename Conf>
// Get a compile error if the bindings cannot provide the thing.
requires (halp::has_fft_1d<Conf, double> && halp::has_logger<Conf>)
struct MyProcessor {
  using logger = typename Conf::logger_type;
  using fft_type = typename Conf::template fft_type<double>;
};

This means that for instance, a processor can log to the Pd or Max console through post(...), to stdout on Python, etc. and that they are relieved of the need to go look for an FFT algorithm.

Hosts like ossia score will be able to plug-in their own FFT implementation optimized for the platform on which the plug-in is running (and binaries will stop having 45 duplicate FFT implementations...).