Program Listing for File limit_interaction.hpp

Return to documentation for file (include/eat/process/limit_interaction.hpp)

#pragma once

#include <adm/elements/audio_object_interaction.hpp>
#include <numeric>
#include <optional>

#include "eat/process/adm_bw64.hpp"

namespace eat::process {

struct Constraint {
  float min{std::numeric_limits<float>::min()};
  float max{std::numeric_limits<float>::max()};
};

struct GainInteractionConstraint {
  std::optional<Constraint> min;
  std::optional<Constraint> max;
  bool permitted{true};
};

struct PositionConstraint {
  std::optional<Constraint> min;
  std::optional<Constraint> max;
  bool permitted{true};
};

struct PositionInteractionConstraint {
  PositionConstraint azimuth;
  PositionConstraint elevation;
  PositionConstraint distance;
  PositionConstraint x;
  PositionConstraint y;
  PositionConstraint z;
};

class InteractionLimiter : public framework::FunctionalAtomicProcess {
 public:
  enum class Droppable { OnOff, Gain, Position };
  struct Config {
    bool remove_disabled_ranges{false};
    std::optional<GainInteractionConstraint> gain_range;
    std::optional<PositionInteractionConstraint> position_range;
    std::vector<Droppable> types_to_disable;
  };
  explicit InteractionLimiter(std::string const &name, Config config);
  void process() override;

 private:
  framework::DataPortPtr<ADMData> in_axml;
  framework::DataPortPtr<ADMData> out_axml;
  Config config;
};

}  // namespace eat::process