summaryrefslogtreecommitdiff
path: root/apps/web/src/core/managers/playback-manager.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/core/managers/playback-manager.ts')
-rw-r--r--apps/web/src/core/managers/playback-manager.ts44
1 files changed, 22 insertions, 22 deletions
diff --git a/apps/web/src/core/managers/playback-manager.ts b/apps/web/src/core/managers/playback-manager.ts
index 1ea09826..a243dc19 100644
--- a/apps/web/src/core/managers/playback-manager.ts
+++ b/apps/web/src/core/managers/playback-manager.ts
@@ -10,6 +10,8 @@ export class PlaybackManager {
private previousVolume = 1;
private isScrubbing = false;
private listeners = new Set<() => void>();
+ private updateListeners = new Set<(time: number) => void>();
+ private seekListeners = new Set<(time: number) => void>();
private playbackTimer: number | null = null;
private playbackStartWallTime = 0;
private playbackStartTime = 0;
@@ -67,7 +69,7 @@ export class PlaybackManager {
this.playbackStartTime = this.currentTime;
}
this.notify();
- this.dispatchSeekEvent(this.currentTime);
+ this.notifySeek(this.currentTime);
}
setVolume({ volume }: { volume: number }): void {
@@ -133,6 +135,16 @@ export class PlaybackManager {
return () => this.listeners.delete(listener);
}
+ onUpdate(listener: (time: number) => void): () => void {
+ this.updateListeners.add(listener);
+ return () => this.updateListeners.delete(listener);
+ }
+
+ onSeek(listener: (time: number) => void): () => void {
+ this.seekListeners.add(listener);
+ return () => this.seekListeners.delete(listener);
+ }
+
private reconcileTimelineScope(): void {
const maxTime = this.editor.timeline.getTotalDuration();
const nextTime = this.clampTimeToTimeline(this.currentTime);
@@ -152,7 +164,7 @@ export class PlaybackManager {
this.notify();
if (timeChanged) {
- this.dispatchSeekEvent(this.currentTime);
+ this.notifySeek(this.currentTime);
}
}
@@ -196,12 +208,12 @@ export class PlaybackManager {
this.pause();
this.currentTime = maxTime;
this.notify();
- this.dispatchSeekEvent(maxTime);
+ this.notifySeek(maxTime);
return;
}
this.currentTime = newTime;
- this.dispatchUpdateEvent(newTime);
+ this.notifyUpdate(newTime);
this.playbackTimer = requestAnimationFrame(this.updateTime);
};
@@ -210,27 +222,15 @@ export class PlaybackManager {
return Math.max(0, Math.min(maxTime, time));
}
- private dispatchSeekEvent(time: number): void {
- if (typeof window === "undefined") {
- return;
+ private notifySeek(time: number): void {
+ for (const fn of this.seekListeners) {
+ fn(time);
}
-
- window.dispatchEvent(
- new CustomEvent("playback-seek", {
- detail: { time },
- }),
- );
}
- private dispatchUpdateEvent(time: number): void {
- if (typeof window === "undefined") {
- return;
+ private notifyUpdate(time: number): void {
+ for (const fn of this.updateListeners) {
+ fn(time);
}
-
- window.dispatchEvent(
- new CustomEvent("playback-update", {
- detail: { time },
- }),
- );
}
}