Program Listing for File rendering_items.hpp

Return to documentation for file (include/eat/render/rendering_items.hpp)

#pragma once
#include <adm/elements/time.hpp>
#include <adm/elements_fwd.hpp>
#include <memory>
#include <optional>
#include <variant>
#include <vector>

namespace eat::render {

struct SilentTrackSpec {
  auto operator<=>(const SilentTrackSpec &) const = default;
};

struct DirectTrackSpec {
  std::shared_ptr<adm::AudioTrackUid> track;
  auto operator<=>(const DirectTrackSpec &) const = default;
};

using TrackSpec = std::variant<DirectTrackSpec, SilentTrackSpec>;

struct ADMPath {
  std::shared_ptr<adm::AudioProgramme> audioProgramme;
  std::shared_ptr<adm::AudioContent> audioContent;
  std::vector<std::shared_ptr<adm::AudioObject>> audioObjects;
  std::vector<std::shared_ptr<adm::AudioPackFormat>> audioPackFormats;
  std::shared_ptr<adm::AudioChannelFormat> audioChannelFormat;
};

struct RenderingItem {
  virtual ~RenderingItem() = default;
};

struct MonoRenderingItem : public RenderingItem {
  TrackSpec track_spec;
  ADMPath adm_path;
};

struct ObjectRenderingItem : public MonoRenderingItem {};

struct DirectSpeakersRenderingItem : public MonoRenderingItem {};

struct HOATypeMetadata {
  std::optional<adm::Time> rtime;
  std::optional<adm::Time> duration;

  // one for each track
  std::vector<int> orders;
  std::vector<int> degrees;

  std::string normalization = "SN3D";

  // empty if nfcRefDist was zero
  std::optional<double> nfcRefDist = {};
  bool screenRef = false;
};

struct HOARenderingItem : public RenderingItem {
  // one for each track
  std::vector<TrackSpec> tracks;
  std::vector<ADMPath> adm_paths;

  // one for each audioBlockFormat; currently always one
  std::vector<HOATypeMetadata> type_metadata;
};

class ItemSelectionError : public std::runtime_error {
  // TODO: add ADMPath here to add context
 public:
  using std::runtime_error::runtime_error;
};

struct SelectionResult {
  std::vector<std::shared_ptr<RenderingItem>> items;
  std::vector<std::string> warnings;
};

struct DefaultStart {};
using ProgrammeStart = std::shared_ptr<adm::AudioProgramme>;
using ContentStart = std::vector<std::shared_ptr<adm::AudioContent>>;
using ObjectStart = std::vector<std::shared_ptr<adm::AudioObject>>;

using SelectionStart = std::variant<DefaultStart, ProgrammeStart, ContentStart, ObjectStart>;

struct SelectionOptions {
  SelectionOptions() = default;
  SelectionOptions(SelectionStart start);

  SelectionStart start = DefaultStart{};
  // TODO: add complementary audioObjects here
};

SelectionResult select_items(const std::shared_ptr<adm::Document> &doc, const SelectionOptions &options = {});
}  // namespace eat::render