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"
12#include <QtQmlIntegration/qqmlintegration.h>
14namespace zrythm::structure::scenes
24class ClipPlaybackService :
public QObject
31 explicit ClipPlaybackService (
32 arrangement::ArrangerObjectRegistry &object_registry,
34 QObject * parent =
nullptr);
50 structure::tracks::ClipQuantizeOption quantize =
51 structure::tracks::ClipQuantizeOption::NextBar);
63 structure::tracks::ClipQuantizeOption quantize =
64 structure::tracks::ClipQuantizeOption::NextBar);
74 structure::tracks::ClipQuantizeOption quantize =
75 structure::tracks::ClipQuantizeOption::NextBar);
85 structure::tracks::ClipQuantizeOption quantize =
86 structure::tracks::ClipQuantizeOption::NextBar);
94 structure::tracks::ClipQuantizeOption quantize =
95 structure::tracks::ClipQuantizeOption::NextBar);
182 void scheduleClipLaunch (
185 structure::tracks::ClipQuantizeOption quantize);
190 void scheduleClipStop (
193 structure::tracks::ClipQuantizeOption quantize);
198 template <arrangement::RegionObject RegionT>
199 void generateClipEvents (
201 const RegionT ®ion,
202 structure::tracks::ClipQuantizeOption quantize)
204 if (track ==
nullptr)
207 auto * processor = track->get_track_processor ();
208 if (processor ==
nullptr)
212 if constexpr (std::is_same_v<RegionT, arrangement::MidiRegion>)
214 processor->clip_playback_data_provider ().generate_midi_events (
217 else if constexpr (std::is_same_v<RegionT, arrangement::AudioRegion>)
219 processor->clip_playback_data_provider ().generate_audio_events (
227 void updateClipSlotState (ClipSlot * clipSlot, ClipSlot::ClipState newState);
232 void startPlaybackStateMonitor (
233 tracks::Track * track,
235 ClipSlot::ClipState targetState);
240 void checkPlaybackState ();
243 arrangement::ArrangerObjectRegistry &object_registry_;
244 const tracks::TrackCollection &track_collection_;
249 std::unordered_map<tracks::Track::Uuid, ClipSlot *> playing_clips_;
256 std::tuple<utils::QObjectUniquePtr<QTimer>, ClipSlot *, ClipSlot::ClipState>>
257 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.