6#include "structure/arrangement/arranger_object_all.h"
7#include "structure/scenes/clip_slot.h"
8#include "structure/tracks/track_collection.h"
10#include <QtQmlIntegration/qqmlintegration.h>
12namespace zrythm::structure::scenes
22class ClipPlaybackService :
public QObject
29 explicit ClipPlaybackService (
30 arrangement::ArrangerObjectRegistry &object_registry,
32 QObject * parent =
nullptr);
48 structure::tracks::ClipQuantizeOption quantize =
49 structure::tracks::ClipQuantizeOption::NextBar);
61 structure::tracks::ClipQuantizeOption quantize =
62 structure::tracks::ClipQuantizeOption::NextBar);
72 structure::tracks::ClipQuantizeOption quantize =
73 structure::tracks::ClipQuantizeOption::NextBar);
83 structure::tracks::ClipQuantizeOption quantize =
84 structure::tracks::ClipQuantizeOption::NextBar);
92 structure::tracks::ClipQuantizeOption quantize =
93 structure::tracks::ClipQuantizeOption::NextBar);
180 void scheduleClipLaunch (
183 structure::tracks::ClipQuantizeOption quantize);
188 void scheduleClipStop (
191 structure::tracks::ClipQuantizeOption quantize);
196 template <arrangement::RegionObject RegionT>
197 void generateClipEvents (
199 const RegionT ®ion,
200 structure::tracks::ClipQuantizeOption quantize)
202 if (track ==
nullptr)
205 auto * processor = track->get_track_processor ();
206 if (processor ==
nullptr)
210 if constexpr (std::is_same_v<RegionT, arrangement::MidiRegion>)
212 processor->clip_playback_data_provider ().generate_midi_events (
215 else if constexpr (std::is_same_v<RegionT, arrangement::AudioRegion>)
217 processor->clip_playback_data_provider ().generate_audio_events (
225 void updateClipSlotState (ClipSlot * clipSlot, ClipSlot::ClipState newState);
230 void startPlaybackStateMonitor (
231 tracks::Track * track,
233 ClipSlot::ClipState targetState);
238 void checkPlaybackState ();
241 arrangement::ArrangerObjectRegistry &object_registry_;
242 const tracks::TrackCollection &track_collection_;
247 std::unordered_map<tracks::Track::Uuid, ClipSlot *> playing_clips_;
254 std::tuple<utils::QObjectUniquePtr<QTimer>, ClipSlot *, ClipSlot::ClipState>>
255 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.