59 std::vector<uint32_t> add_slots(std::initializer_list<RelationSlot> slots);
68 [[nodiscard]] std::optional<std::reference_wrapper<RelationSlot>> find_slot(std::string_view
name);
69 [[nodiscard]] std::optional<std::reference_wrapper<const RelationSlot>> find_slot(std::string_view
name)
const;
75 [[nodiscard]] std::optional<uint32_t> find_slot_index(std::string_view
name)
const;
77 [[nodiscard]]
size_t slot_count() const noexcept {
return m_slots.size(); }
79 [[nodiscard]] std::vector<RelationSlot>&
slots() noexcept {
return m_slots; }
80 [[nodiscard]]
const std::vector<RelationSlot>&
slots() const noexcept {
return m_slots; }
92 template <std::derived_from<RelationOperator> Op,
typename... Args>
93 requires std::constructible_from<Op, Args...>
94 std::shared_ptr<Op>
add(Args&&... args)
96 auto op = get_operator_chain()->emplace<Op>(std::forward<Args>(args)...);
97 op->set_slots(m_slots);
98 if (op->publishes_output()) {
99 m_publishers.push_back(op);
104 void process_batch(
unsigned int num_samples)
override;
111 [[nodiscard]] std::optional<std::vector<double>> get_audio_buffer()
const override;
120 [[nodiscard]] std::optional<double> get_node_output(
size_t index)
const override;
125 [[nodiscard]] std::optional<std::span<const double>> get_node_audio_buffer(
size_t index)
const override;
130 [[nodiscard]]
size_t get_output_count()
const;
136 [[nodiscard]] std::optional<std::span<const double>> get_output_block(
size_t index)
const;
138 [[nodiscard]] std::unordered_map<std::string, std::string> get_metadata()
const override;