diff --git a/src/Track.ts b/src/Track.ts index 2e1c61f..959248f 100644 --- a/src/Track.ts +++ b/src/Track.ts @@ -577,6 +577,16 @@ export class Track { private _playHtml5(): void { if (this.audio.preload !== 'auto') this.audio.preload = 'auto'; this.audio.playbackRate = this.queueRef.playbackRate; + if (isFinite(this.pausedAtTrackTime) && this.pausedAtTrackTime > this.audio.currentTime + 0.5) { + if (this.audio.readyState >= HTMLMediaElement.HAVE_METADATA) { + this.audio.currentTime = this.pausedAtTrackTime; + } else { + const target = this.pausedAtTrackTime; + this.audio.addEventListener('loadedmetadata', () => { + this.audio.currentTime = target; + }, { once: true }); + } + } const promise = this.audio.play(); if (promise) { promise.catch((err: unknown) => { diff --git a/src/machines/track.machine.ts b/src/machines/track.machine.ts index b5396aa..dff034b 100644 --- a/src/machines/track.machine.ts +++ b/src/machines/track.machine.ts @@ -177,6 +177,15 @@ export function createTrackMachine(initialContext: TrackContext) { // ----------------------------------------------------------------- idle: { on: { + SEEK: [ + { + guard: 'isWebAudioOnly', + actions: ['reportProgress'], + }, + { + actions: ['seekHtml5', 'reportProgress'], + }, + ], HTML5_ENDED: { actions: ['notifyTrackEnded'], }, @@ -340,6 +349,15 @@ export function createTrackMachine(initialContext: TrackContext) { // ----------------------------------------------------------------- loading: { on: { + SEEK: [ + { + guard: 'isWebAudioOnly', + actions: ['reportProgress'], + }, + { + actions: ['seekHtml5', 'reportProgress'], + }, + ], BUFFER_LOADING: { actions: 'setLoadingState', },