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"
11#include <QtQmlIntegration/qqmlintegration.h>
13namespace zrythm::structure::scenes
23class ClipPlaybackService :
public QObject
30 explicit ClipPlaybackService (
31 arrangement::ArrangerObjectRegistry &object_registry,
33 QObject * parent =
nullptr);
49 structure::tracks::ClipQuantizeOption quantize =
50 structure::tracks::ClipQuantizeOption::NextBar);
62 structure::tracks::ClipQuantizeOption quantize =
63 structure::tracks::ClipQuantizeOption::NextBar);
73 structure::tracks::ClipQuantizeOption quantize =
74 structure::tracks::ClipQuantizeOption::NextBar);
84 structure::tracks::ClipQuantizeOption quantize =
85 structure::tracks::ClipQuantizeOption::NextBar);
93 structure::tracks::ClipQuantizeOption quantize =
94 structure::tracks::ClipQuantizeOption::NextBar);
181 void scheduleClipLaunch (
184 structure::tracks::ClipQuantizeOption quantize);
189 void scheduleClipStop (
192 structure::tracks::ClipQuantizeOption quantize);
197 template <arrangement::RegionObject RegionT>
198 void generateClipEvents (
200 const RegionT ®ion,
201 structure::tracks::ClipQuantizeOption quantize)
203 if (track ==
nullptr)
206 auto * processor = track->get_track_processor ();
207 if (processor ==
nullptr)
211 if constexpr (std::is_same_v<RegionT, arrangement::MidiRegion>)
213 processor->clip_playback_data_provider ().generate_midi_events (
216 else if constexpr (std::is_same_v<RegionT, arrangement::AudioRegion>)
218 processor->clip_playback_data_provider ().generate_audio_events (
226 void updateClipSlotState (ClipSlot * clipSlot, ClipSlot::ClipState newState);
231 void startPlaybackStateMonitor (
232 tracks::Track * track,
234 ClipSlot::ClipState targetState);
239 void checkPlaybackState ();
242 arrangement::ArrangerObjectRegistry &object_registry_;
243 const tracks::TrackCollection &track_collection_;
248 std::unordered_map<tracks::Track::Uuid, ClipSlot *> playing_clips_;
255 std::tuple<utils::QObjectUniquePtr<QTimer>, ClipSlot *, ClipSlot::ClipState>>
256 playback_state_monitors_;
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.