Skip to content

Commit d2c55fc

Browse files
BADGERS 658 (#97)
1 parent 8777346 commit d2c55fc

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

src/streaming/models/VideoModel.js

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ function VideoModel() {
9090
element.playbackRate = value;
9191
return;
9292
}
93-
93+
9494
// If media element hasn't loaded enough data to play yet, wait until it has
9595
waitForReadyState(Constants.VIDEO_ELEMENT_READY_STATES.HAVE_FUTURE_DATA, () => {
9696
element.playbackRate = value;
@@ -252,21 +252,32 @@ function VideoModel() {
252252
stalledStreams.push(type);
253253

254254
if (
255-
settings.get().streaming.buffer.syntheticStallEvents.enabled &&
256-
element &&
257-
stalledStreams.length === 1 &&
255+
settings.get().streaming.buffer.syntheticStallEvents.enabled &&
256+
element &&
257+
stalledStreams.length === 1 &&
258258
(settings.get().streaming.buffer.syntheticStallEvents.ignoreReadyState || getReadyState() >= Constants.VIDEO_ELEMENT_READY_STATES.HAVE_FUTURE_DATA)
259259
) {
260-
logger.debug(`emitting synthetic waiting event and halting playback with playback rate 0`);
260+
function emitSyntheticWaitingEvent() {
261+
logger.debug(`emitting synthetic waiting event and halting playback with playback rate 0`);
261262

262-
previousPlaybackRate = element.playbackRate;
263+
previousPlaybackRate = element.playbackRate;
264+
setPlaybackRate(0, true);
263265

264-
setPlaybackRate(0, true);
266+
const event = document.createEvent('Event');
267+
event.initEvent('waiting', true, false);
268+
element.dispatchEvent(event);
269+
}
265270

266-
// Halt playback until nothing is stalled.
267-
const event = document.createEvent('Event');
268-
event.initEvent('waiting', true, false);
269-
element.dispatchEvent(event);
271+
if (!element.paused) {
272+
// Halt Playback until nothing is stalled
273+
emitSyntheticWaitingEvent();
274+
} else {
275+
const event = 'playing';
276+
element.addEventListener(event, function emitWaitOnPlay () {
277+
if (stalledStreams.length === 1) emitSyntheticWaitingEvent();
278+
element.removeEventListener(event, emitWaitOnPlay);
279+
});
280+
}
270281
}
271282
}
272283

@@ -282,7 +293,7 @@ function VideoModel() {
282293

283294

284295
if (settings.get().streaming.buffer.syntheticStallEvents.enabled && element && !isStalled() && element.playbackRate === 0) {
285-
const resume = () => {
296+
const resume = () => {
286297
logger.debug(`emitting synthetic playing event (if not paused) and resuming playback with playback rate: ${previousPlaybackRate || 1}`);
287298

288299
setPlaybackRate(previousPlaybackRate || 1, settings.get().streaming.buffer.syntheticStallEvents.ignoreReadyState);
@@ -299,7 +310,7 @@ function VideoModel() {
299310
} else {
300311
if (resumeReadyStateFunction && resumeReadyStateFunction.func && resumeReadyStateFunction.event) {
301312
removeEventListener(resumeReadyStateFunction.event, resumeReadyStateFunction.func);
302-
}
313+
}
303314
resumeReadyStateFunction = waitForReadyState(Constants.VIDEO_ELEMENT_READY_STATES.HAVE_FUTURE_DATA, resume)
304315
}
305316
}

0 commit comments

Comments
 (0)