Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
track_factory.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <utility>
7
8#include "gui/backend/backend/settings_manager.h"
9#include "gui/dsp/plugin_all.h"
10#include "structure/tracks/track_all.h"
11
12namespace zrythm::structure::tracks
13{
14
18class TrackFactory : public QObject
19{
20 Q_OBJECT
21 QML_ELEMENT
22
23 using ArrangerObjectRegistry = arrangement::ArrangerObjectRegistry;
24
25public:
26 TrackFactory () = delete;
27 TrackFactory (
28 TrackRegistry &track_registry,
29 PluginRegistry &plugin_registry,
30 PortRegistry &port_registry,
31 ArrangerObjectRegistry &arranger_object_registry,
32 gui::SettingsManager &settings_mgr,
33 QObject * parent = nullptr)
34 : QObject (parent), track_registry_ (track_registry),
35 plugin_registry_ (plugin_registry), port_registry_ (port_registry),
36 arranger_object_registry_ (arranger_object_registry),
37 settings_manager_ (settings_mgr)
38 {
39 }
40
41 static TrackFactory * get_instance ();
42
43 template <typename TrackT> class Builder
44 {
45 friend class TrackFactory;
46
47 private:
48 explicit Builder (
49 TrackRegistry &track_registry,
50 PluginRegistry &plugin_registry,
51 PortRegistry &port_registry,
52 ArrangerObjectRegistry &arranger_object_registry)
53 : track_registry_ (track_registry), plugin_registry_ (plugin_registry),
54 port_registry_ (port_registry),
55 arranger_object_registry_ (arranger_object_registry)
56 {
57 }
58
59 Builder &with_settings_manager (gui::SettingsManager &settings_manager)
60 {
61 settings_manager_ = settings_manager;
62 return *this;
63 }
64
65 public:
66 std::unique_ptr<TrackT> build_for_deserialization () const
67 {
68 // FIXME: DRY
69 if constexpr (utils::Initializable<TrackT>)
70 {
71 return TrackT::create_unique (
72 track_registry_, plugin_registry_, port_registry_,
73 arranger_object_registry_, false);
74 }
75 else
76 {
77 return std::make_unique<TrackT> (
78 track_registry_, plugin_registry_, port_registry_,
79 arranger_object_registry_, false);
80 }
81 }
82
83 auto build ()
84 {
85 auto obj_ref = [&] () {
86 return track_registry_.create_object<TrackT> (
87 track_registry_, plugin_registry_, port_registry_,
88 arranger_object_registry_, true);
89 }();
90
91 // auto * obj = std::get<PluginT *> (obj_ref.get_object ());
92
93 return obj_ref;
94 }
95
96 private:
97 TrackRegistry &track_registry_;
98 PluginRegistry &plugin_registry_;
99 PortRegistry &port_registry_;
100 ArrangerObjectRegistry &arranger_object_registry_;
101 OptionalRef<gui::SettingsManager> settings_manager_;
102 };
103
104 template <typename TrackT> auto get_builder () const
105 {
106 auto builder =
108 track_registry_, plugin_registry_, port_registry_,
109 arranger_object_registry_)
110 .with_settings_manager (settings_manager_);
111 return builder;
112 }
113
114private:
115 template <FinalTrackSubclass TrackT>
116 TrackUuidReference create_empty_track () const
117 {
118 auto obj_ref = get_builder<TrackT> ().build ();
119 return obj_ref;
120 }
121
122 auto create_empty_track (Track::Type type) const
123 {
124 switch (type)
125 {
127 return create_empty_track<AudioTrack> ();
129 return create_empty_track<MidiTrack> ();
131 return create_empty_track<MidiGroupTrack> ();
133 return create_empty_track<FolderTrack> ();
135 return create_empty_track<InstrumentTrack> ();
137 return create_empty_track<MasterTrack> ();
139 return create_empty_track<ChordTrack> ();
141 return create_empty_track<MarkerTrack> ();
143 return create_empty_track<ModulatorTrack> ();
145 return create_empty_track<AudioBusTrack> ();
147 return create_empty_track<MidiBusTrack> ();
149 return create_empty_track<AudioGroupTrack> ();
150 }
151 }
152
153public:
154 template <FinalTrackSubclass TrackT>
155 auto add_empty_track (Tracklist &tracklist)
156 {
157 auto track_ref = create_empty_track<TrackT> ();
158// TODO
159#if 0
160 tracklist.append_track (
161 track_ref,
162 *audio_engine_, false, false);
163#endif
164 return track_ref;
165 }
166
167 Q_INVOKABLE QVariant addEmptyTrackFromType (int type)
168 {
169 Track::Type tt = ENUM_INT_TO_VALUE (Track::Type, type);
170 // if (zrythm_app->check_and_show_trial_limit_error ())
171 // return;
172
173 try
174 {
175 auto * track_base = Track::create_empty_with_action (tt);
176 std::visit (
177 [&] (auto &&track) {
178 using TrackT = base_type<decltype (track)>;
179 z_debug (
180 "created {} track: {}", typename_to_string<TrackT> (),
181 track->get_name ());
182 },
183 convert_to_variant<TrackPtrVariant> (track_base));
184 return QVariant::fromStdVariant (
185 convert_to_variant<TrackPtrVariant> (track_base));
186 }
187 catch (const ZrythmException &e)
188 {
189 e.handle (QObject::tr ("Failed to create track"));
190 }
191 // TODO
192 return {};
193 }
194
195 template <typename TrackT>
196 auto clone_new_object_identity (const TrackT &other) const
197 {
198 return plugin_registry_.clone_object (other, plugin_registry_);
199 }
200
201 template <typename TrackT>
202 auto clone_object_snapshot (const TrackT &other, QObject &owner) const
203 {
204 TrackT * new_obj{};
205
206 new_obj = other.clone_qobject (
207 &owner, utils::ObjectCloneType::Snapshot, plugin_registry_);
208 return new_obj;
209 }
210
211private:
212 TrackRegistry &track_registry_;
213 PluginRegistry &plugin_registry_;
214 PortRegistry &port_registry_;
215 arrangement::ArrangerObjectRegistry &arranger_object_registry_;
216 gui::SettingsManager &settings_manager_;
217};
218
219} // namespace zrythm::structure::tracks
@ Marker
Marker Track's contain named markers at specific Position's in the song.
Definition track.h:326
@ AudioGroup
Group Tracks are used for grouping audio signals, for example routing multiple drum tracks to a "Drum...
Definition track.h:345
@ AudioBus
Buses are channels that receive audio input and have effects on their channel strip.
Definition track.h:338
@ Modulator
Special track to contain global Modulator's.
Definition track.h:331
@ Midi
Midi tracks can only have MIDI effects in the strip and produce MIDI output that can be routed to ins...
Definition track.h:351
@ Instrument
Instrument tracks must have an Instrument plugin at the first slot and they produce audio output.
Definition track.h:304
@ Folder
Foldable track used for visual grouping.
Definition track.h:360
@ Audio
Audio tracks can record and contain audio clips.
Definition track.h:310
@ MidiGroup
Same with audio group but for MIDI signals.
Definition track.h:357
@ MidiBus
Same with audio bus but for MIDI signals.
Definition track.h:354
@ Chord
The chord track contains chords that can be used to modify midi in real time or to color the piano ro...
Definition track.h:321
@ Master
The master track is a special type of group track.
Definition track.h:315
@ Snapshot
Creates a snapshot of the object with the same identity.
Definition icloneable.h:24
Wrapper around std::optional<std::reference_wrapper<T>> that provides a more convenient API.
Definition types.h:308