From d4a3eb8e5710a8b4a243c44f723993add2fcfde0 Mon Sep 17 00:00:00 2001 From: Wesley Luyten Date: Tue, 26 Jul 2022 08:07:13 -0500 Subject: [PATCH] fix: waiting bug --- examples/index.html | 4 ++++ examples/sign-language.html | 4 ++++ src/media-group-controller.ts | 27 +++++++++++++++++++-------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/examples/index.html b/examples/index.html index af4fb24..b65c9d7 100644 --- a/examples/index.html +++ b/examples/index.html @@ -64,6 +64,10 @@

Syncing Language Audio

console.log(e.type); }); + controller.addEventListener('waiting', (e) => { + console.log(e.type); + }); + playbtn.onclick = () => { if (controller.playbackState === 'waiting') { controller.play() diff --git a/examples/sign-language.html b/examples/sign-language.html index c37ee0d..740221d 100644 --- a/examples/sign-language.html +++ b/examples/sign-language.html @@ -110,6 +110,10 @@

Sign Language (ASL)

console.log(e.type); }); + controller.addEventListener('waiting', (e) => { + console.log(e.type); + }); + playbtn.onclick = async () => { if (controller.playbackState === 'waiting') { controller.play(); diff --git a/src/media-group-controller.ts b/src/media-group-controller.ts index baffa5d..bdd0b81 100644 --- a/src/media-group-controller.ts +++ b/src/media-group-controller.ts @@ -97,7 +97,10 @@ export class MediaGroupController extends EventTarget { if (media !== this.#baseMedia) { if (!this.#promises.currentTime) { const diff = Math.abs(this.currentTime - media.currentTime); - if (diff > (toNumberOrUndefined(media.dataset.groupSeekPrecision) ?? 0.5)) { + if ( + diff > + (toNumberOrUndefined(media.dataset.groupSeekPrecision) ?? 0.5) + ) { this.currentTime = media.currentTime; } } @@ -119,15 +122,20 @@ export class MediaGroupController extends EventTarget { this.#prevPlaybackRate = this.playbackRate; this.playbackRate = 0; this.dispatchEvent(new Event('waiting')); + + const interval = setInterval(() => { + if ( + this.#prevPlaybackRate != null && + this.#mediaList.every((media) => media.readyState >= 3) + ) { + clearInterval(interval); + this.playbackRate = this.#prevPlaybackRate; + this.#prevPlaybackRate = undefined; + } + }, 100); }, progress: () => { this.dispatchEvent(new Event('progress')); - if (this.#prevPlaybackRate == null) return; - - if (this.#mediaList.every((media) => media.readyState >= 3)) { - this.playbackRate = this.#prevPlaybackRate - this.#prevPlaybackRate = undefined; - } }, volumechange: ({ currentTarget }) => { if (currentTarget !== this.#baseMedia) return; @@ -298,7 +306,10 @@ export class MediaGroupController extends EventTarget { return; } - if (sourcePlaybackRate > 0 && child.playbackRate != sourcePlaybackRate) { + if ( + sourcePlaybackRate > 0 && + child.playbackRate != sourcePlaybackRate + ) { child.playbackRate = sourcePlaybackRate; }