@@ -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