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/clip_playback_data_provider.h"
10#include "structure/tracks/track_collection.h"
11
12#include <QtQmlIntegration/qqmlintegration.h>
13
14namespace zrythm::structure::scenes
15{
16
24class ClipPlaybackService : public QObject
25{
26 Q_OBJECT
27 QML_ELEMENT
28 QML_UNCREATABLE ("")
29
30public:
31 explicit ClipPlaybackService (
32 arrangement::ArrangerObjectRegistry &object_registry,
33 const tracks::TrackCollection &track_collection,
34 QObject * parent = nullptr);
35
36 // ========================================================================
37 // Clip Operations
38 // ========================================================================
39
47 Q_INVOKABLE void launchClip (
48 tracks::Track * track,
49 ClipSlot * clipSlot,
50 structure::tracks::ClipQuantizeOption quantize =
51 structure::tracks::ClipQuantizeOption::NextBar);
52
60 Q_INVOKABLE void stopClip (
61 tracks::Track * track,
62 ClipSlot * clipSlot,
63 structure::tracks::ClipQuantizeOption quantize =
64 structure::tracks::ClipQuantizeOption::NextBar);
65
72 Q_INVOKABLE void launchScene (
73 Scene * scene,
74 structure::tracks::ClipQuantizeOption quantize =
75 structure::tracks::ClipQuantizeOption::NextBar);
76
83 Q_INVOKABLE void stopScene (
84 Scene * scene,
85 structure::tracks::ClipQuantizeOption quantize =
86 structure::tracks::ClipQuantizeOption::NextBar);
87
93 Q_INVOKABLE void stopAllClips (
94 structure::tracks::ClipQuantizeOption quantize =
95 structure::tracks::ClipQuantizeOption::NextBar);
96
97 // ========================================================================
98 // State Queries
99 // ========================================================================
100
107 Q_INVOKABLE bool isClipPlaying (ClipSlot * clipSlot) const;
108
116 Q_INVOKABLE double getClipPlaybackPosition (ClipSlot * clipSlot) const;
117
123 Q_INVOKABLE QList<ClipSlot *> getPlayingClips () const;
124
125 // ========================================================================
126 // Track Playback Mode Management
127 // ========================================================================
128
135
141 Q_INVOKABLE void setTrackToTimelineMode (tracks::Track * track);
142
152
153Q_SIGNALS:
157 void clipLaunched (tracks::Track * track, ClipSlot * clipSlot);
158
162 void clipStopped (tracks::Track * track, ClipSlot * clipSlot);
163
167 void sceneLaunched (Scene * scene);
168
172 void sceneStopped (Scene * scene);
173
174private:
175 // ========================================================================
176 // Internal Implementation
177 // ========================================================================
178
182 void scheduleClipLaunch (
183 tracks::Track * track,
184 ClipSlot * clipSlot,
185 structure::tracks::ClipQuantizeOption quantize);
186
190 void scheduleClipStop (
191 tracks::Track * track,
192 ClipSlot * clipSlot,
193 structure::tracks::ClipQuantizeOption quantize);
194
198 template <arrangement::RegionObject RegionT>
199 void generateClipEvents (
200 tracks::Track * track,
201 const RegionT &region,
202 structure::tracks::ClipQuantizeOption quantize)
203 {
204 if (track == nullptr)
205 return;
206
207 auto * processor = track->get_track_processor ();
208 if (processor == nullptr)
209 return;
210
211 // Generate events using the clip launcher event provider
212 if constexpr (std::is_same_v<RegionT, arrangement::MidiRegion>)
213 {
214 processor->clip_playback_data_provider ().generate_midi_events (
215 region, quantize);
216 }
217 else if constexpr (std::is_same_v<RegionT, arrangement::AudioRegion>)
218 {
219 processor->clip_playback_data_provider ().generate_audio_events (
220 region, quantize);
221 }
222 }
223
227 void updateClipSlotState (ClipSlot * clipSlot, ClipSlot::ClipState newState);
228
232 void startPlaybackStateMonitor (
233 tracks::Track * track,
234 ClipSlot * clipSlot,
235 ClipSlot::ClipState targetState);
236
240 void checkPlaybackState ();
241
242private:
243 arrangement::ArrangerObjectRegistry &object_registry_;
244 const tracks::TrackCollection &track_collection_;
245
249 std::unordered_map<tracks::Track::Uuid, ClipSlot *> playing_clips_;
250
254 std::unordered_map<
255 tracks::Track::Uuid,
256 std::tuple<utils::QObjectUniquePtr<QTimer>, ClipSlot *, ClipSlot::ClipState>>
257 playback_state_monitors_;
258};
259
260}
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:61