Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
recording_materializer.h
1// SPDX-FileCopyrightText: © 2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include <cstdint>
7#include <functional>
8#include <unordered_map>
9
10#include "controllers/recording_coordinator.h"
11#include "controllers/recording_mode.h"
12#include "structure/arrangement/arranger_object_all.h"
13#include "undo/undo_stack.h"
14#include "utils/audio.h"
15#include "utils/qt.h"
16
17#include <QObject>
18
19namespace zrythm::controllers
20{
21
38class RecordingMaterializer : public QObject
39{
40 Q_OBJECT
41
42public:
43 using RecordingMode = recording::RecordingMode;
44
46 {
47 structure::arrangement::ArrangerObjectUuidReference region;
48 size_t actual_lane_index{};
49 };
50 using RegionCreationResult = std::optional<CreatedRegion>;
51 using RegionCreator = std::function<RegionCreationResult (
52 structure::tracks::TrackUuid track_id,
53 units::sample_t start_position,
54 const utils::audio::AudioBuffer &initial_frames,
55 size_t lane_index)>;
56
57 using RecordingModeProvider = std::function<RecordingMode ()>;
58
59 explicit RecordingMaterializer (
60 RecordingCoordinator &recording_coordinator,
61 undo::UndoStack &undo_stack,
62 RegionCreator region_creator,
63 RecordingModeProvider recording_mode_provider,
64 QObject * parent = nullptr);
65
66 ~RecordingMaterializer () override;
67
68 Q_DISABLE_COPY_MOVE (RecordingMaterializer)
69
70private:
71 struct TrackRecordingState
72 {
73 std::optional<structure::arrangement::ArrangerObjectUuidReference>
74 current_region;
75 std::optional<units::sample_t> last_end_position;
76 size_t current_lane_index = 0;
77 };
78
79 void on_audio_data_ready (
80 structure::tracks::TrackUuid track_id,
81 const std::vector<RecordingAudioPacket> &packets);
82
83 std::optional<structure::arrangement::ArrangerObjectUuidReference>
84 get_or_create_region (
85 TrackRecordingState &state,
86 structure::tracks::TrackUuid track_id,
87 units::sample_t start_position,
88 const utils::audio::AudioBuffer &initial_frames);
89
91 get_clip_for_region (structure::arrangement::AudioRegion &region);
92
93 void finalize_recording_macro ();
94
95 RecordingCoordinator &recording_coordinator_;
96 QPointer<undo::UndoStack> undo_stack_;
97 RegionCreator region_creator_;
98 RecordingModeProvider recording_mode_provider_;
99
100 std::unordered_map<structure::tracks::TrackUuid, TrackRecordingState>
101 track_states_;
102
108 utils::audio::AudioBuffer scratch_buf_{ 2, 0 };
109
110 bool recording_macro_active_ = false;
111};
112
113}
Orchestrates the recording lifecycle across all armed tracks.
Audio clips for the pool.
A region for playing back audio samples.