42 Q_DISABLE_COPY_MOVE (Port)
44 using FullDesignationProvider =
49 void set_full_designation_provider (FullDesignationProvider provider)
51 full_designation_provider_ = std::move (provider);
60 full_designation_provider_ = [owner] (
const Port &port) {
61 return owner->get_full_designation_for_port (port);
65 bool is_input ()
const {
return flow_ == PortFlow::Input; }
66 bool is_output ()
const {
return flow_ == PortFlow::Output; }
68 bool is_midi ()
const {
return type_ == PortType::Midi; }
69 bool is_cv ()
const {
return type_ == PortType::CV; }
70 bool is_audio ()
const {
return type_ == PortType::Audio; }
72 utils::Utf8String get_label ()
const {
return label_; }
74 auto get_symbol ()
const {
return sym_; }
75 void set_symbol (
const utils::Utf8String &sym) { sym_ = sym; }
91 virtual void clear_buffer (std::size_t offset, std::size_t nframes) = 0;
99 return full_designation_provider_ (*
this);
102 bool has_label ()
const {
return !label_.empty (); }
103 PortType type ()
const {
return type_; }
104 PortFlow flow ()
const {
return flow_; }
108 utils::Utf8String label,
111 QObject * parent =
nullptr);
117 static constexpr auto kFlowId =
"flow"sv;
118 static constexpr auto kLabelId =
"label"sv;
119 static constexpr auto kSymbolId =
"symbol"sv;
120 static constexpr auto kPortGroupId =
"portGroup"sv;
121 friend void to_json (nlohmann::json &j,
const Port &p);
122 friend void from_json (
const nlohmann::json &j, Port &p);
125 FullDesignationProvider full_designation_provider_ =
126 [
this] (
const Port &port) {
return get_label (); };
134 utils::Utf8String label_;
141 utils::Utf8String sym_;
144 std::optional<utils::Utf8String> port_group_;
146 BOOST_DESCRIBE_CLASS (
148 (utils::UuidIdentifiableObject<Port>),
151 (label_, sym_, port_group_))
157 std::pair<const PortT *, std::unique_ptr<dsp::PortConnection>>;
162 auto &port_sources ()
const {
return port_sources_; }
168 self.port_sources_.clear ();
169 if (self.flow () != PortFlow::Input)
171 throw std::runtime_error (
173 "Destination port '{}' must be an input port (is {})",
174 self.get_full_designation (),
175 self.flow () == PortFlow::Output ?
"Output" :
"Unknown"));
177 for (
const auto &source_port : source_ports)
179 if (source_port->flow () != PortFlow::Output)
181 throw std::runtime_error (
183 "Source port '{}' must be an output port (is {}), destination '{}'",
184 source_port->get_full_designation (),
185 source_port->flow () == PortFlow::Input ?
"Input" :
"Unknown",
186 self.get_full_designation ()));
188 self.port_sources_.push_back (
191 std::make_unique<dsp::PortConnection> (
192 source_port->get_uuid (), self.get_uuid (), 1.f,
true,
true)));
202 std::vector<ElementType> port_sources_;