Loading...
Searching...
No Matches
score-lib-process/Process/Process.hpp
1#pragma once
2#include <Process/Dataflow/PortForward.hpp>
3#include <Process/ExpandMode.hpp>
4#include <Process/Preset.hpp>
5#include <Process/ProcessFlags.hpp>
6#include <Process/TimeValue.hpp>
7
8#include <Magnetism/MagneticInfo.hpp>
9
10#include <score/model/Component.hpp>
11#include <score/model/EntityImpl.hpp>
12#include <score/model/Identifier.hpp>
13#include <score/model/ModelMetadata.hpp>
14#include <score/plugins/SerializableInterface.hpp>
15#include <score/selection/Selectable.hpp>
16#include <score/selection/Selection.hpp>
17#include <score/serialization/VisitorInterface.hpp>
18#include <score/tools/Metadata.hpp>
19
20#include <ossia/detail/small_vector.hpp>
21
22#include <QString>
23
24#include <QMetaProperty>
25#include <score_lib_process_export.h>
26#include <smallfun.hpp>
27
28#include <optional>
29#include <vector>
30#include <verdigris>
31
33namespace ossia
34{
35class value;
36}
37namespace Process
38{
39class Port;
40class Inlet;
41class ControlInlet;
42class Outlet;
43class AudioInlet;
44class AudioOutlet;
45class MidiInlet;
46class MidiOutlet;
47class ProcessModelFactory;
48class LayerFactory;
49class ProcessModel;
50class LayerFactory;
51struct Inlets;
52struct Outlets;
53
59class SCORE_LIB_PROCESS_EXPORT ProcessModel
60 : public score::Entity<ProcessModel>
61 , public score::SerializableInterface<ProcessModel>
62{
63 W_OBJECT(ProcessModel)
64 SCORE_SERIALIZE_FRIENDS
65public:
66 Selectable selection{this};
68 TimeVal duration, const Id<ProcessModel>& id, const QString& name,
69 QObject* parent);
70
71 ProcessModel(DataStream::Deserializer& vis, QObject* parent);
72 ProcessModel(JSONObject::Deserializer& vis, QObject* parent);
73
74 virtual ~ProcessModel();
75
76 // If the process can have multiple distinct implementations
77 // for which presets are incompatible, e.g. VST, Faust...
78 // This allows to differentiate them
79 virtual QString effect() const noexcept;
80
81 // A user-friendly text to show to the users
82 virtual QString prettyName() const noexcept;
83 virtual QString prettyShortName() const noexcept = 0;
84 virtual QString category() const noexcept = 0;
85 virtual QStringList tags() const noexcept = 0;
86 virtual ProcessFlags flags() const noexcept = 0;
87
90 void setParentDuration(ExpandMode mode, const TimeVal& t) noexcept;
91
92 virtual TimeVal contentDuration() const noexcept;
93
94 void setDuration(const TimeVal& other) noexcept;
95 const TimeVal& duration() const noexcept;
96
98 QPointF position() const noexcept;
99 QSizeF size() const noexcept;
100
101 void setPosition(const QPointF& v);
102 void setSize(const QSizeF& v);
103
104 void positionChanged(QPointF p) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, positionChanged, p)
105 void sizeChanged(QSizeF p) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, sizeChanged, p)
106
107 PROPERTY(
108 QPointF, position W_READ position W_WRITE setPosition W_NOTIFY positionChanged)
109 PROPERTY(QSizeF, size W_READ size W_WRITE setSize W_NOTIFY sizeChanged)
110
111
112 virtual ProcessStateDataInterface* startStateData() const noexcept;
113 virtual ProcessStateDataInterface* endStateData() const noexcept;
114
116 virtual Selection selectableChildren() const noexcept;
117 virtual Selection selectedChildren() const noexcept;
118 virtual void setSelection(const Selection& s) const noexcept;
119
120 double getSlotHeight() const noexcept;
121 void setSlotHeight(double) noexcept;
122
123 const Process::Inlets& inlets() const noexcept { return m_inlets; }
124 const Process::Outlets& outlets() const noexcept { return m_outlets; }
125
126 Process::Inlet* inlet(const Id<Process::Port>&) const noexcept;
127 Process::Outlet* outlet(const Id<Process::Port>&) const noexcept;
128
129 virtual void loadPreset(const Preset& preset);
130 virtual Preset savePreset() const noexcept;
131 virtual std::vector<Process::Preset> builtinPresets() const noexcept;
132
133 // Called when an ancestor was moved in the timeline
134 virtual void ancestorStartDateChanged();
135 virtual void ancestorTempoChanged();
136
137 virtual void forEachControl(
138 smallfun::function<void(Process::ControlInlet&, const ossia::value&)>) const;
139
140 // Magnetism
141 virtual std::optional<Process::MagneticInfo>
142 magneticPosition(const QObject* o, const TimeVal t) const noexcept;
143
144 // Clip duration things
145 bool loops() const noexcept { return m_loops; }
146 void setLoops(bool b);
147 void loopsChanged(bool b) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, loopsChanged, b)
148 PROPERTY(bool, loops W_READ loops W_WRITE setLoops W_NOTIFY loopsChanged)
149
150 TimeVal startOffset() const noexcept { return m_startOffset; }
151 void setStartOffset(TimeVal b);
152 void startOffsetChanged(TimeVal b)
153 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, startOffsetChanged, b)
154 PROPERTY(
155 TimeVal,
156 startOffset W_READ startOffset W_WRITE setStartOffset W_NOTIFY startOffsetChanged)
157
158 TimeVal loopDuration() const noexcept { return m_loopDuration; }
159 void setLoopDuration(TimeVal b);
160 void loopDurationChanged(TimeVal b)
161 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, loopDurationChanged, b)
162 PROPERTY(
163 TimeVal, loopDuration W_READ loopDuration W_WRITE setLoopDuration W_NOTIFY
164 loopDurationChanged)
165
166 virtual void setCreatingControls(bool ok);
167 bool creatingControls() const noexcept;
168 void creatingControlsChanged(bool b)
169 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, creatingControlsChanged, b)
170 PROPERTY(
171 bool, creatingControls W_READ creatingControls W_WRITE setCreatingControls W_NOTIFY
172 creatingControlsChanged)
173
174 // FIXME ugh
175 QWidget* scriptUI{};
176 QWidget* externalUI{};
177
179 bool executing() const noexcept { return m_executing; }
180 void setExecuting(bool v);
181 void startExecution() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, startExecution)
182 void stopExecution() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, stopExecution)
183 void resetExecution() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, resetExecution)
184
185 void durationChanged(const TimeVal& arg_1)
186 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, durationChanged, arg_1)
187 void useParentDurationChanged(bool arg_1)
188 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, useParentDurationChanged, arg_1)
189
190 void slotHeightChanged(double arg_1)
191 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, slotHeightChanged, arg_1)
192 void prettyNameChanged() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, prettyNameChanged)
193
194 void inletsChanged() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, inletsChanged)
195 void outletsChanged() E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, outletsChanged)
196
197 void controlAdded(const Id<Process::Port>& arg_1)
198 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlAdded, arg_1)
199 void controlRemoved(const Process::Port& arg_1)
200 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlRemoved, arg_1)
201 void controlOutletAdded(const Id<Process::Port>& arg_1)
202 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlOutletAdded, arg_1)
203 void controlOutletRemoved(const Process::Port& arg_1)
204 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, controlOutletRemoved, arg_1)
205
206 void benchmark(double arg_1) E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, benchmark, arg_1)
207 void externalUIVisible(bool v) const
208 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, externalUIVisible, v)
209 void scriptUIVisible(bool v) const
210 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, scriptUIVisible, v)
211
212 void flagsChanged() const
213 E_SIGNAL(SCORE_LIB_PROCESS_EXPORT, flagsChanged)
214
215protected:
216 // Used to scale the process.
217 // This should be commutative :
218 // setDurationWithScale(2); setDurationWithScale(3);
219 // yields the same result as :
220 // setDurationWithScale(3); setDurationWithScale(2);
221 virtual void setDurationAndScale(const TimeVal& newDuration) noexcept;
222
223 // Does nothing if newDuration < currentDuration
224 virtual void setDurationAndGrow(const TimeVal& newDuration) noexcept;
225
226 // Does nothing if newDuration > currentDuration
227 virtual void setDurationAndShrink(const TimeVal& newDuration) noexcept;
228
229 Process::Inlets m_inlets;
230 Process::Outlets m_outlets;
231
232private:
233 TimeVal m_duration{};
234 double m_slotHeight{};
235 TimeVal m_startOffset{};
236 TimeVal m_loopDuration{};
237 QPointF m_position{};
238 QSizeF m_size{};
239 bool m_loops{};
240 bool m_executing{};
241};
242
243SCORE_LIB_PROCESS_EXPORT
244ProcessModel* parentProcess(QObject* obj) noexcept;
245SCORE_LIB_PROCESS_EXPORT
246const ProcessModel* parentProcess(const QObject* obj) noexcept;
247
248SCORE_LIB_PROCESS_EXPORT
249QString processLocalTreeAddress(const Process::ProcessModel& proc);
250}
251DEFAULT_MODEL_METADATA(Process::ProcessModel, "Process")
252
253Q_DECLARE_METATYPE(Id<Process::ProcessModel>)
254W_REGISTER_ARGTYPE(Id<Process::ProcessModel>)
255W_REGISTER_ARGTYPE(OptionalId<Process::ProcessModel>)
256
257Q_DECLARE_METATYPE(Process::ProcessModel*)
258Q_DECLARE_METATYPE(const Process::ProcessModel*)
259W_REGISTER_ARGTYPE(Process::ProcessModel*)
260W_REGISTER_ARGTYPE(const Process::ProcessModel*)
261W_REGISTER_ARGTYPE(QPointer<const Process::ProcessModel>)
262W_REGISTER_ARGTYPE(QPointer<Process::ProcessModel>)
263
264Q_DECLARE_METATYPE(std::shared_ptr<Process::Preset>)
265W_REGISTER_ARGTYPE(std::shared_ptr<Process::Preset>)
Definition DataStreamVisitor.hpp:202
Definition JSONVisitor.hpp:423
Definition Port.hpp:205
Definition Port.hpp:179
Definition Port.hpp:274
Definition Port.hpp:103
The Process class.
Definition score-lib-process/Process/Process.hpp:62
bool executing() const noexcept
Execution.
Definition score-lib-process/Process/Process.hpp:179
Definition ProcessStateDataInterface.hpp:24
The Selectable class.
Definition Selectable.hpp:14
Definition Selection.hpp:12
The id_base_t class.
Definition Identifier.hpp:59
Base for complex model objects.
Definition EntityBase.hpp:24
Generic serialization method for abstract classes.
Definition SerializableInterface.hpp:21
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
ProcessFlags
Various settings for processes.
Definition ProcessFlags.hpp:17
STL namespace.
Definition PortForward.hpp:23
Definition PortForward.hpp:27
Definition Preset.hpp:32
Definition TimeValue.hpp:21