Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
clip_playback_service.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/arrangement/arranger_object_all.h"
7#include "structure/scenes/clip_slot.h"
8#include "structure/scenes/scene.h"
9#include "structure/tracks/track_collection.h"
10
11#include <QtQmlIntegration/qqmlintegration.h>
12
13namespace zrythm::structure::scenes
14{
15
23class ClipPlaybackService : public QObject
24{
25 Q_OBJECT
26 QML_ELEMENT
27 QML_UNCREATABLE ("")
28
29public:
30 explicit ClipPlaybackService (
31 arrangement::ArrangerObjectRegistry &object_registry,
32 const tracks::TrackCollection &track_collection,
33 QObject * parent = nullptr);
34
35 // ========================================================================
36 // Clip Operations
37 // ========================================================================
38
46 Q_INVOKABLE void launchClip (
47 tracks::Track * track,
48 ClipSlot * clipSlot,
49 structure::tracks::ClipQuantizeOption quantize =
50 structure::tracks::ClipQuantizeOption::NextBar);
51
59 Q_INVOKABLE void stopClip (
60 tracks::Track * track,
61 ClipSlot * clipSlot,
62 structure::tracks::ClipQuantizeOption quantize =
63 structure::tracks::ClipQuantizeOption::NextBar);
64
71 Q_INVOKABLE void launchScene (
72 Scene * scene,
73 structure::tracks::ClipQuantizeOption quantize =
74 structure::tracks::ClipQuantizeOption::NextBar);
75
82 Q_INVOKABLE void stopScene (
83 Scene * scene,
84 structure::tracks::ClipQuantizeOption quantize =
85 structure::tracks::ClipQuantizeOption::NextBar);
86
92 Q_INVOKABLE void stopAllClips (
93 structure::tracks::ClipQuantizeOption quantize =
94 structure::tracks::ClipQuantizeOption::NextBar);
95
96 // ========================================================================
97 // State Queries
98 // ========================================================================
99
106 Q_INVOKABLE bool isClipPlaying (ClipSlot * clipSlot) const;
107
115 Q_INVOKABLE double getClipPlaybackPosition (ClipSlot * clipSlot) const;
116
122 Q_INVOKABLE QList<ClipSlot *> getPlayingClips () const;
123
124 // ========================================================================
125 // Track Playback Mode Management
126 // ========================================================================
127
134
140 Q_INVOKABLE void setTrackToTimelineMode (tracks::Track * track);
141
151
152Q_SIGNALS:
156 void clipLaunched (tracks::Track * track, ClipSlot * clipSlot);
157
161 void clipStopped (tracks::Track * track, ClipSlot * clipSlot);
162
166 void sceneLaunched (Scene * scene);
167
171 void sceneStopped (Scene * scene);
172
173private:
174 // ========================================================================
175 // Internal Implementation
176 // ========================================================================
177
181 void scheduleClipLaunch (
182 tracks::Track * track,
183 ClipSlot * clipSlot,
184 structure::tracks::ClipQuantizeOption quantize);
185
189 void scheduleClipStop (
190 tracks::Track * track,
191 ClipSlot * clipSlot,
192 structure::tracks::ClipQuantizeOption quantize);
193
197 template <arrangement::RegionObject RegionT>
198 void generateClipEvents (
199 tracks::Track * track,
200 const RegionT &region,
201 structure::tracks::ClipQuantizeOption quantize)
202 {
203 if (track == nullptr)
204 return;
205
206 auto * processor = track->get_track_processor ();
207 if (processor == nullptr)
208 return;
209
210 // Generate events using the clip launcher event provider
211 if constexpr (std::is_same_v<RegionT, arrangement::MidiRegion>)
212 {
213 processor->clip_playback_data_provider ().generate_midi_events (
214 region, quantize);
215 }
216 else if constexpr (std::is_same_v<RegionT, arrangement::AudioRegion>)
217 {
218 processor->clip_playback_data_provider ().generate_audio_events (
219 region, quantize);
220 }
221 }
222
226 void updateClipSlotState (ClipSlot * clipSlot, ClipSlot::ClipState newState);
227
231 void startPlaybackStateMonitor (
232 tracks::Track * track,
233 ClipSlot * clipSlot,
234 ClipSlot::ClipState targetState);
235
239 void checkPlaybackState ();
240
241private:
242 arrangement::ArrangerObjectRegistry &object_registry_;
243 const tracks::TrackCollection &track_collection_;
244
248 std::unordered_map<tracks::Track::Uuid, ClipSlot *> playing_clips_;
249
253 std::unordered_map<
254 tracks::Track::Uuid,
255 std::tuple<utils::QObjectUniquePtr<QTimer>, ClipSlot *, ClipSlot::ClipState>>
256 playback_state_monitors_;
257};
258
259}
Q_INVOKABLE void stopAllClips(structure::tracks::ClipQuantizeOption quantize=structure::tracks::ClipQuantizeOption::NextBar)
Stop all playing clips across all tracks.
void setTrackToClipLauncherMode(tracks::Track *track)
Set a track to use clip launcher mode.
Q_INVOKABLE void launchScene(Scene *scene, structure::tracks::ClipQuantizeOption quantize=structure::tracks::ClipQuantizeOption::NextBar)
Launch all clips in a scene.
Q_INVOKABLE QList< ClipSlot * > getPlayingClips() const
Get all currently playing clips.
Q_INVOKABLE void launchClip(tracks::Track *track, ClipSlot *clipSlot, structure::tracks::ClipQuantizeOption quantize=structure::tracks::ClipQuantizeOption::NextBar)
Launch a clip with quantization.
void sceneStopped(Scene *scene)
Emitted when a scene is stopped.
Q_INVOKABLE bool isClipPlaying(ClipSlot *clipSlot) const
Check if a clip is currently playing.
void clipStopped(tracks::Track *track, ClipSlot *clipSlot)
Emitted when a clip is stopped.
Q_INVOKABLE void stopScene(Scene *scene, structure::tracks::ClipQuantizeOption quantize=structure::tracks::ClipQuantizeOption::NextBar)
Stop all clips in a scene.
void cancelPendingClipOperations(tracks::Track *track)
Cancel any pending clip operations for a track.
Q_INVOKABLE double getClipPlaybackPosition(ClipSlot *clipSlot) const
Get the current playback position of a clip, in.
Q_INVOKABLE void stopClip(tracks::Track *track, ClipSlot *clipSlot, structure::tracks::ClipQuantizeOption quantize=structure::tracks::ClipQuantizeOption::NextBar)
Stop a clip with quantization.
void sceneLaunched(Scene *scene)
Emitted when a scene is launched.
Q_INVOKABLE void setTrackToTimelineMode(tracks::Track *track)
Set a track to use timeline mode.
void clipLaunched(tracks::Track *track, ClipSlot *clipSlot)
Emitted when a clip is launched.
A collection of tracks that provides a QAbstractListModel interface.
Represents a track in the project.
Definition track.h:54