From a4dc9ddef8a6750e6c56f7c77e24b484a452beae Mon Sep 17 00:00:00 2001 From: Rob Walch Date: Wed, 14 Apr 2021 11:46:51 -0400 Subject: [PATCH] Reset stream controller ENDED state after flushing the buffer Resumes streaming after level or track switch after the last segment has been appended --- src/controller/audio-stream-controller.ts | 13 ++----------- src/controller/base-stream-controller.ts | 3 +++ 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/controller/audio-stream-controller.ts b/src/controller/audio-stream-controller.ts index 2668a54aba6..56e7e74c99b 100644 --- a/src/controller/audio-stream-controller.ts +++ b/src/controller/audio-stream-controller.ts @@ -648,12 +648,7 @@ class AudioStreamController 'Buffer full error also media.currentTime is not buffered, flush audio buffer' ); this.fragCurrent = null; - // flush everything - this.hls.trigger(Events.BUFFER_FLUSHING, { - startOffset: 0, - endOffset: Number.POSITIVE_INFINITY, - type: 'audio', - }); + super.flushMainBuffer(0, Number.POSITIVE_INFINITY, 'audio'); } } break; @@ -824,11 +819,7 @@ class AudioStreamController const { hls, media, trackId } = this; if (media) { this.log('Switching audio track : flushing all audio'); - hls.trigger(Events.BUFFER_FLUSHING, { - startOffset: 0, - endOffset: Number.POSITIVE_INFINITY, - type: 'audio', - }); + super.flushMainBuffer(0, Number.POSITIVE_INFINITY, 'audio'); } this.audioSwitch = false; hls.trigger(Events.AUDIO_TRACK_SWITCHED, { id: trackId }); diff --git a/src/controller/base-stream-controller.ts b/src/controller/base-stream-controller.ts index faaf3710dea..d3e67afbaec 100644 --- a/src/controller/base-stream-controller.ts +++ b/src/controller/base-stream-controller.ts @@ -1185,6 +1185,9 @@ export default class BaseStreamController // (so that we will check against video.buffered ranges in case of alt audio track) const bufferedTimeRanges = BufferHelper.getBuffered(media); this.fragmentTracker.detectEvictedFragments(type, bufferedTimeRanges); + if (this.state === State.ENDED) { + this.state = State.IDLE; + } } protected resetLiveStartWhenNotLoaded(level: number): boolean {