@@ -394,6 +394,9 @@ shaka.media.StallDetector = class {
394
394
/** @override */
395
395
release ( ) {
396
396
// Drop external references to make things easier on the GC.
397
+ if ( this . implementation_ ) {
398
+ this . implementation_ . release ( ) ;
399
+ }
397
400
this . implementation_ = null ;
398
401
this . onStall_ = null ;
399
402
}
@@ -465,6 +468,11 @@ shaka.media.StallDetector.Implementation = class {
465
468
* @return {number }
466
469
*/
467
470
getWallSeconds ( ) { }
471
+
472
+ /**
473
+ * Releases object
474
+ */
475
+ release ( ) { }
468
476
} ;
469
477
470
478
@@ -482,6 +490,34 @@ shaka.media.StallDetector.MediaElementImplementation = class {
482
490
constructor ( mediaElement ) {
483
491
/** @private {!HTMLMediaElement} */
484
492
this . mediaElement_ = mediaElement ;
493
+ /**
494
+ * For listeners scoped to the lifetime of the instance.
495
+ * @private {shaka.util.EventManager}
496
+ */
497
+ this . audioEventManager_ = new shaka . util . EventManager ( ) ;
498
+ /**
499
+ * Audio focus state
500
+ * @private {boolean}
501
+ */
502
+ this . audioFocusPaused_ = false ;
503
+ // Audio Focus temporary leads to playback pause.
504
+ this . audioEventManager_ . listen ( this . mediaElement_ ,
505
+ 'audiofocuspaused' , ( ) => {
506
+ shaka . log . info ( `Audio focus paused` ) ;
507
+ this . audioFocusPaused_ = true ;
508
+ } ) ;
509
+ // Audio Focus is granted. App can play now.
510
+ this . audioEventManager_ . listen ( this . mediaElement_ ,
511
+ 'audiofocusgranted' , ( ) => {
512
+ shaka . log . info ( `Audio focus granted` ) ;
513
+ this . audioFocusPaused_ = false ;
514
+ } ) ;
515
+ // Audio focus is lost, app shouldn't play anymore.
516
+ this . audioEventManager_ . listen ( this . mediaElement_ ,
517
+ 'audiofocuslost' , ( ) => {
518
+ shaka . log . info ( `Audio focus lost` ) ;
519
+ this . audioFocusPaused_ = true ;
520
+ } ) ;
485
521
}
486
522
487
523
/** @override */
@@ -494,7 +530,10 @@ shaka.media.StallDetector.MediaElementImplementation = class {
494
530
if ( this . mediaElement_ . playbackRate == 0 ) {
495
531
return false ;
496
532
}
497
-
533
+ // If playback paused due to no audio focus, we ignore the stall.
534
+ if ( this . audioFocusPaused_ ) {
535
+ return false ;
536
+ }
498
537
// If we have don't have enough content, we are not stalled, we are
499
538
// buffering.
500
539
if ( this . mediaElement_ . buffered . length == 0 ) {
@@ -542,5 +581,13 @@ shaka.media.StallDetector.MediaElementImplementation = class {
542
581
543
582
return false ;
544
583
}
584
+
585
+ /** @override */
586
+ release ( ) {
587
+ if ( this . audioEventManager_ ) {
588
+ this . audioEventManager_ . release ( ) ;
589
+ }
590
+ this . audioEventManager_ = null ;
591
+ }
545
592
} ;
546
593
0 commit comments