Zrythm v2.0.0-alpha.1
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#include "utils/registry_utils.h"
8
9namespace zrythm::structure::tracks
10{
11
15class TrackFactory
16{
17public:
18 using DependenciesProvider = std::function<FinalTrackDependencies ()>;
19
20 TrackFactory (DependenciesProvider dependencies_provider)
21 : dependencies_provider_ (std::move (dependencies_provider))
22 {
23 }
24
25 template <typename TrackT> class Builder
26 {
27 friend class TrackFactory;
28
29 private:
30 explicit Builder (FinalTrackDependencies track_deps)
31 : track_deps_ (std::move (track_deps))
32 {
33 }
34
35 public:
36 std::unique_ptr<TrackT> build_for_deserialization () const
37 {
38 return std::make_unique<TrackT> (track_deps_);
39 }
40
41 auto build ()
42 {
43 auto obj_ref =
44 utils::create_object<TrackT> (track_deps_.registry_, track_deps_);
45 auto * track = obj_ref.template get_object_as<TrackT> ();
46 track->set_default_name ();
47 return obj_ref;
48 }
49
50 private:
51 FinalTrackDependencies track_deps_;
52 };
53
54 template <typename TrackT> auto get_builder () const
55 {
56 auto builder = Builder<TrackT> (dependencies_provider_ ());
57 return builder;
58 }
59
60 template <FinalTrackSubclass TrackT>
61 TrackUuidReference create_empty_track () const
62 {
63 auto obj_ref = get_builder<TrackT> ().build ();
64 return obj_ref;
65 }
66
67 TrackUuidReference create_empty_track (Track::Type type) const
68 {
69 switch (type)
70 {
72 return create_empty_track<AudioTrack> ();
74 return create_empty_track<MidiTrack> ();
76 return create_empty_track<MidiGroupTrack> ();
78 return create_empty_track<FolderTrack> ();
80 return create_empty_track<InstrumentTrack> ();
82 return create_empty_track<MasterTrack> ();
84 return create_empty_track<ChordTrack> ();
86 return create_empty_track<MarkerTrack> ();
88 return create_empty_track<ModulatorTrack> ();
90 return create_empty_track<AudioBusTrack> ();
92 return create_empty_track<MidiBusTrack> ();
94 return create_empty_track<AudioGroupTrack> ();
95 }
96
97 throw std::invalid_argument ("invalid track type");
98 }
99
100 template <typename TrackT>
101 auto clone_new_object_identity (const TrackT &other) const
102 {
103 auto track_dependencies = dependencies_provider_ ();
104 return utils::clone_object (other, track_dependencies.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 (
114 &owner, utils::ObjectCloneType::Snapshot, track_dependencies.registry_);
115 return new_obj;
116 }
117
118private:
119 DependenciesProvider dependencies_provider_;
120};
121
122} // namespace zrythm::structure::tracks
@ Marker
Marker Track's contain named markers at specific Position's in the song.
Definition track.h:119
@ AudioGroup
Group Tracks are used for grouping audio signals, for example routing multiple drum tracks to a "Drum...
Definition track.h:138
@ AudioBus
Buses are channels that receive audio input and have effects on their channel strip.
Definition track.h:131
@ Modulator
Special track to contain global Modulator's.
Definition track.h:124
@ Midi
Midi tracks can only have MIDI effects in the strip and produce MIDI output that can be routed to ins...
Definition track.h:144
@ Instrument
Instrument tracks must have an Instrument plugin at the first slot and they produce audio output.
Definition track.h:97
@ Folder
Foldable track used for visual grouping.
Definition track.h:153
@ Audio
Audio tracks can record and contain audio clips.
Definition track.h:103
@ MidiGroup
Same with audio group but for MIDI signals.
Definition track.h:150
@ MidiBus
Same with audio bus but for MIDI signals.
Definition track.h:147
@ 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:114
@ Master
The master track is a special type of group track.
Definition track.h:108
@ Snapshot
Creates a snapshot of the object with the same identity.
Definition icloneable.h:23