Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
track_factory.h
1// SPDX-FileCopyrightText: © 2025-2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "structure/tracks/track_all.h"
7
8namespace zrythm::structure::tracks
9{
10
14class TrackFactory
15{
16public:
17 using DependenciesProvider = std::function<FinalTrackDependencies ()>;
18
19 TrackFactory (DependenciesProvider dependencies_provider)
20 : dependencies_provider_ (std::move (dependencies_provider))
21 {
22 }
23
24 template <typename TrackT> class Builder
25 {
26 friend class TrackFactory;
27
28 private:
29 explicit Builder (FinalTrackDependencies track_deps)
30 : track_deps_ (std::move (track_deps))
31 {
32 }
33
34 public:
35 std::unique_ptr<TrackT> build_for_deserialization () const
36 {
37 return std::make_unique<TrackT> (track_deps_);
38 }
39
40 auto build ()
41 {
42 auto obj_ref =
43 track_deps_.track_registry_.create_object<TrackT> (track_deps_);
44 auto * track = obj_ref.template get_object_as<TrackT> ();
45 track->set_default_name ();
46 return obj_ref;
47 }
48
49 private:
50 FinalTrackDependencies track_deps_;
51 };
52
53 template <typename TrackT> auto get_builder () const
54 {
55 auto builder = Builder<TrackT> (dependencies_provider_ ());
56 return builder;
57 }
58
59 template <FinalTrackSubclass TrackT>
60 TrackUuidReference create_empty_track () const
61 {
62 auto obj_ref = get_builder<TrackT> ().build ();
63 return obj_ref;
64 }
65
66 TrackUuidReference create_empty_track (Track::Type type) const
67 {
68 switch (type)
69 {
71 return create_empty_track<AudioTrack> ();
73 return create_empty_track<MidiTrack> ();
75 return create_empty_track<MidiGroupTrack> ();
77 return create_empty_track<FolderTrack> ();
79 return create_empty_track<InstrumentTrack> ();
81 return create_empty_track<MasterTrack> ();
83 return create_empty_track<ChordTrack> ();
85 return create_empty_track<MarkerTrack> ();
87 return create_empty_track<ModulatorTrack> ();
89 return create_empty_track<AudioBusTrack> ();
91 return create_empty_track<MidiBusTrack> ();
93 return create_empty_track<AudioGroupTrack> ();
94 }
95
96 throw std::invalid_argument ("invalid track type");
97 }
98
99 template <typename TrackT>
100 auto clone_new_object_identity (const TrackT &other) const
101 {
102 auto track_dependencies = dependencies_provider_ ();
103 return track_dependencies.plugin_registry_.clone_object (
104 other, track_dependencies.plugin_registry_);
105 }
106
107 template <typename TrackT>
108 auto clone_object_snapshot (const TrackT &other, QObject &owner) const
109 {
110 auto track_dependencies = dependencies_provider_ ();
111 TrackT * new_obj{};
112
113 new_obj = other.clone_qobject (
115 track_dependencies.plugin_registry_);
116 return new_obj;
117 }
118
119private:
120 DependenciesProvider dependencies_provider_;
121};
122
123} // namespace zrythm::structure::tracks
@ Marker
Marker Track's contain named markers at specific Position's in the song.
Definition track.h:124
@ AudioGroup
Group Tracks are used for grouping audio signals, for example routing multiple drum tracks to a "Drum...
Definition track.h:143
@ AudioBus
Buses are channels that receive audio input and have effects on their channel strip.
Definition track.h:136
@ Modulator
Special track to contain global Modulator's.
Definition track.h:129
@ Midi
Midi tracks can only have MIDI effects in the strip and produce MIDI output that can be routed to ins...
Definition track.h:149
@ Instrument
Instrument tracks must have an Instrument plugin at the first slot and they produce audio output.
Definition track.h:102
@ Folder
Foldable track used for visual grouping.
Definition track.h:158
@ Audio
Audio tracks can record and contain audio clips.
Definition track.h:108
@ MidiGroup
Same with audio group but for MIDI signals.
Definition track.h:155
@ MidiBus
Same with audio bus but for MIDI signals.
Definition track.h:152
@ 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:119
@ Master
The master track is a special type of group track.
Definition track.h:113
@ Snapshot
Creates a snapshot of the object with the same identity.
Definition icloneable.h:23