2 #include <Process/Dataflow/Port.hpp>
3 #include <Process/Dataflow/PortFactory.hpp>
4 #include <Process/GenericProcessFactory.hpp>
5 #include <Process/Process.hpp>
6 #include <Process/ProcessFactory.hpp>
7 #include <Process/ProcessMetadata.hpp>
9 #include <Crousti/Attributes.hpp>
10 #include <Crousti/Concepts.hpp>
11 #include <Crousti/Metadatas.hpp>
12 #include <Media/Sound/Drop/SoundDrop.hpp>
14 #include <ossia/detail/typelist.hpp>
16 #include <boost/pfr.hpp>
18 #include <avnd/common/for_nth.hpp>
19 #include <avnd/concepts/file_port.hpp>
20 #include <avnd/concepts/gfx.hpp>
21 #include <avnd/concepts/temporality.hpp>
22 #include <avnd/concepts/ui.hpp>
23 #include <avnd/introspection/messages.hpp>
24 #include <avnd/wrappers/bus_host_process_adapter.hpp>
25 #include <avnd/wrappers/metadatas.hpp>
27 #include <score_plugin_engine.hpp>
30 #include <Gfx/TexturePort.hpp>
36 inline QString fromStringView(std::string_view v)
38 return QString::fromUtf8(v.data(), v.size());
43 template <
typename Info>
46 template <
typename Info>
47 requires avnd::has_name<Info>
50 static constexpr
const char* get() noexcept {
return avnd::get_name<Info>().data(); }
52 template <
typename Info>
53 requires avnd::has_category<Info>
56 static constexpr
const char* get() noexcept
58 return avnd::get_category<Info>().data();
61 template <
typename Info>
62 requires(!avnd::has_category<Info>)
65 static constexpr
const char* get() noexcept {
return ""; }
68 template <
typename Info>
71 static QStringList get() noexcept
74 for(std::string_view tag : avnd::get_tags<Info>())
75 lst.push_back(QString::fromUtf8(tag.data(), tag.size()));
81 concept has_kind = requires { T::kind(); };
86 if constexpr(has_kind<T>)
89 return Process::ProcessCategory::Other;
92 template <
typename Info>
95 static std::vector<Process::PortType> inletDescription()
97 std::vector<Process::PortType> port;
110 static std::vector<Process::PortType> outletDescription()
112 std::vector<Process::PortType> port;
128 #if defined(_MSC_VER)
129 #define if_exists(Expr, Else) []() noexcept { if(false) {} Else; } ()
130 #define if_attribute(Attr) QString{}
132 #define if_exists(Expr, Else) \
134 if constexpr(requires { Expr; }) \
139 #define if_attribute(Attr) \
140 []() noexcept -> QString { \
141 if constexpr(avnd::has_##Attr<Info>) \
142 return fromStringView(avnd::get_##Attr<Info>()); \
150 if_exists(Info::kind(),
else return Process::ProcessCategory::Other;),
151 if_attribute(category), if_attribute(description), if_attribute(author),
158 template <
typename Info>
163 if constexpr(requires { Info::flags(); })
165 return Info::flags();
170 Process::ProcessFlags::SupportsLasting
171 | Process::ProcessFlags::ControlSurface);
173 if constexpr(avnd::tag_single_exec<Info>)
174 flags |= Process::ProcessFlags::SupportsState;
180 template <
typename Info>
183 static constexpr
auto get() noexcept {
return avnd::get_c_name<Info>().data(); }
185 template <
typename Info>
186 struct Metadata<ConcreteKey_k, oscr::ProcessModel<Info>>
190 return oscr::uuid_from_string<Info>();
197 template <
typename T>
198 auto& modelPort(
auto& ports,
int index)
202 if constexpr(avnd::audio_argument_processor<T>)
206 index += avnd::messages_introspection<T>::size;
211 template <
typename T>
215 #if !defined(__APPLE__)
216 constexpr
auto name = avnd::get_name<T>();
217 obj->setName(fromStringView(name));
219 if constexpr(constexpr
auto desc = avnd::get_description<T>(); !desc.empty())
220 obj->setDescription(fromStringView(desc));
222 auto name = avnd::get_name<T>();
223 obj->setName(fromStringView(name));
224 if(
auto desc = avnd::get_description<T>(); !desc.empty())
225 obj->setDescription(fromStringView(desc));
229 template <std::
size_t N,
typename T>
230 inline void setupNewPort(
const avnd::field_reflection<N, T>& spec,
Process::Port* obj)
232 setupNewPort<T>(obj);
235 template <
typename T>
238 setupNewPort<T>(obj);
241 template <
typename Node>
248 void operator()(
const avnd::audio_port
auto& in,
auto idx)
254 void operator()(
const avnd::midi_port
auto& in,
auto idx)
261 static QString toFilters(
const QSet<QString>& exts)
264 for(
const auto& s : exts)
271 res.resize(res.size() - 1);
275 template <
typename P>
276 static QString getFilters(P& p)
278 if constexpr(requires { P::filters(); })
280 using filter = decltype(P::filters());
282 requires { filter::sound; } || requires { filter::audio; })
284 return QString{
"Sound files (%1)"}.arg(
287 else if constexpr(requires { filter::video; })
290 QSet<QString> files = {
"mkv",
"mov",
"mp4",
"h264",
"avi",
"hap",
"mpg",
291 "mpeg",
"imf",
"mxf",
"mts",
"m2ts",
"mj2",
"webm"};
292 return QString{
"Videos (%1)"}.arg(toFilters(files));
294 else if constexpr(requires { filter::image; })
297 return QString{
"Images (*.png *.jpg *.jpeg *.gif *.bmp *.tiff)"};
299 else if constexpr(requires { filter::midi; })
301 return "MIDI (*.mid)";
303 else if constexpr(avnd::string_ish<filter>)
305 constexpr
auto text_filters = P::filters();
306 return fromStringView(P::filters());
319 template <
typename T>
320 requires avnd::soundfile_port<T>
321 void operator()(
const T& in,
auto idx)
323 constexpr
auto name = avnd::get_name<T>();
324 Process::FileChooserBase* p{};
325 if constexpr(requires { T::waveform; })
327 p =
new Process::AudioFileChooser{
328 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
333 p =
new Process::FileChooser{
334 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
341 if constexpr(avnd::tag_file_watch<T>)
343 p->enableFileWatch();
347 template <
typename T>
348 requires avnd::midifile_port<T> || avnd::raw_file_port<T>
349 void operator()(
const T& in,
auto idx)
351 constexpr
auto name = avnd::get_name<T>();
353 auto p =
new Process::FileChooser{
354 "", getFilters(in), QString::fromUtf8(name.data(), name.size()),
359 if constexpr(avnd::tag_file_watch<T>)
361 p->enableFileWatch();
365 template <avnd::parameter T, std::
size_t N>
366 void operator()(
const T& in, avnd::field_index<N>)
368 if constexpr(avnd::control<T> || avnd::curve_port<T>)
370 auto p = oscr::make_control_in<Node, T>(
372 if constexpr(!std::is_same_v<std::decay_t<decltype(p)>, std::nullptr_t>)
380 setupNewPort(in, vp);
387 setupNewPort(in, vp);
394 void operator()(
const avnd::texture_port
auto& in,
auto idx)
400 void operator()(
const avnd::geometry_port
auto& in,
auto idx)
408 template <std::
size_t Idx, avnd::message T>
409 void operator()(
const avnd::field_reflection<Idx, T>& in)
416 template <std::
size_t Idx, avnd::unreflectable_message<Node> T>
417 void operator()(
const avnd::field_reflection<Idx, T>& in)
424 void operator()(
const auto& ctrl,
auto idx)
427 qDebug() << fromStringView(avnd::get_name(ctrl)) <<
"unhandled";
431 template <
typename Node>
438 void operator()(
const avnd::audio_port
auto& out,
auto idx)
441 setupNewPort(out, p);
443 p->setPropagate(
true);
447 void operator()(
const avnd::midi_port
auto& out,
auto idx)
450 setupNewPort(out, p);
454 template <avnd::parameter T, std::
size_t N>
455 void operator()(
const T& out, avnd::field_index<N>)
457 if constexpr(avnd::control<T>)
459 if(
auto p = oscr::make_control_out<T>(
468 setupNewPort(out, vp);
475 setupNewPort(out, vp);
482 void operator()(
const avnd::texture_port
auto& out,
auto idx)
485 setupNewPort(out, p);
488 void operator()(
const avnd::geometry_port
auto& out,
auto idx)
491 setupNewPort(out, p);
496 void operator()(
const avnd::curve_port
auto& out,
auto idx)
499 setupNewPort(out, p);
503 void operator()(
const avnd::callback
auto& out,
auto idx)
506 setupNewPort(out, p);
510 void operator()(
const auto& ctrl,
auto idx)
512 qDebug() << fromStringView(avnd::get_name(ctrl)) <<
"unhandled";
516 template <
typename Info>
521 template <
typename Info>
528 struct dummy_ui_callback
530 void operator()(
const QByteArray& arr) noexcept { }
534 template <avnd::has_processor_to_gui_bus Info>
537 std::function<void(QByteArray)> to_ui = dummy_ui_callback{};
540 template <avnd::has_gui_to_processor_bus Info>
543 std::function<void(QByteArray)> from_ui = dummy_ui_callback{};
546 template <
typename Info>
552 SCORE_SERIALIZE_FRIENDS
555 friend struct
TSerializer<JSONObject, oscr::ProcessModel<Info>>;
559 const TimeVal& duration, const Id<Process::ProcessModel>& id, QObject* parent)
563 metadata().setInstanceName(*
this);
565 avnd::port_visit_dispatcher<Info>(
569 const TimeVal& duration,
const QString& custom,
574 metadata().setInstanceName(*
this);
576 avnd::port_visit_dispatcher<Info>(
579 if constexpr(avnd::file_input_introspection<Info>::size > 0)
581 constexpr
auto idx = avnd::file_input_introspection<Info>::index_to_field_index(0);
582 setupInitialStringPort(idx, custom);
584 else if constexpr(avnd::control_input_introspection<Info>::size > 0)
587 = avnd::control_input_introspection<Info>::index_to_field_index(0);
589 typename avnd::control_input_introspection<Info>::template nth_element<0>;
590 if constexpr(avnd::string_ish<decltype(type::value)>)
591 setupInitialStringPort(idx, custom);
595 void setupInitialStringPort(
int idx,
const QString& custom) noexcept
598 auto pp = safe_cast<Process::ControlInlet*>(port);
600 if(pp->value().target<std::string>())
602 pp->setValue(custom.toStdString());
606 template <
typename Impl>
617 template <
typename Info>
618 struct is_custom_serialized<oscr::ProcessModel<Info>> : std::true_type
622 template <
typename Info>
628 Process::readPorts(s, obj.m_inlets, obj.m_outlets);
636 obj.m_outlets, &obj);
641 template <
typename Info>
647 Process::readPorts(s, obj.m_inlets, obj.m_outlets);
654 obj.m_outlets, &obj);
Metadata to categorize objects: curves, audio, etc.
Definition: lib/score/tools/Metadata.hpp:61
Definition: VisitorInterface.hpp:53
Definition: DataStreamVisitor.hpp:27
Definition: DataStreamVisitor.hpp:202
Definition: TexturePort.hpp:121
Definition: TexturePort.hpp:144
Definition: VisitorInterface.hpp:61
Definition: JSONVisitor.hpp:52
Definition: JSONVisitor.hpp:423
Metadata to get the key part of ObjectIdentifier.
Definition: lib/score/tools/Metadata.hpp:36
Metadata to get the name that will be shown in the user interface.
Definition: lib/score/tools/Metadata.hpp:42
Definition: score-lib-process/Process/Dataflow/Port.hpp:290
Definition: score-lib-process/Process/Dataflow/Port.hpp:313
Definition: score-lib-process/Process/Dataflow/Port.hpp:176
Definition: score-lib-process/Process/Dataflow/Port.hpp:369
Definition: score-lib-process/Process/Dataflow/Port.hpp:392
Definition: PortFactory.hpp:65
Definition: score-lib-process/Process/Dataflow/Port.hpp:102
The Process class.
Definition: score-lib-process/Process/Process.hpp:61
Definition: score-lib-process/Process/Dataflow/Port.hpp:481
Definition: score-lib-process/Process/Dataflow/Port.hpp:504
Metadata to retrieve the ProcessFlags of a process.
The id_base_t class.
Definition: Identifier.hpp:57
Definition: score-plugin-avnd/Crousti/ProcessModel.hpp:551
Base classes and tools to implement processes and layers.
Definition: JSONVisitor.hpp:1324
ProcessFlags
Various settings for processes.
Definition: ProcessFlags.hpp:17
Definition: score-lib-process/Process/ProcessMetadata.hpp:36
Definition: PortForward.hpp:23
Definition: PortForward.hpp:27
Definition: VisitorInterface.hpp:13
Definition: TimeValue.hpp:21
Definition: score-plugin-avnd/Crousti/ProcessModel.hpp:243
Definition: score-plugin-avnd/Crousti/ProcessModel.hpp:523
Definition: score-plugin-avnd/Crousti/ProcessModel.hpp:518
Definition: score-plugin-avnd/Crousti/ProcessModel.hpp:433