diff --git a/lib/media/play_rate_controller.js b/lib/media/play_rate_controller.js index 9f2311dca..e0a59238a 100644 --- a/lib/media/play_rate_controller.js +++ b/lib/media/play_rate_controller.js @@ -39,7 +39,9 @@ shaka.media.PlayRateController = class { /** @private {shaka.util.Timer} */ this.timer_ = new shaka.util.Timer(() => { - this.harness_.movePlayhead(this.rate_ * this.pollRate_); + if (!this.harness_.isPaused()) { + this.harness_.movePlayhead(this.rate_ * this.pollRate_); + } }); } @@ -172,6 +174,7 @@ shaka.media.PlayRateController = class { * getDefaultRate: function():number, * setRate: function(number), * movePlayhead: function(number), + * isPaused: function():boolean, * }} * * @description @@ -192,5 +195,8 @@ shaka.media.PlayRateController = class { * Move the playhead N seconds. If N is positive, the playhead will move * forward abs(N) seconds. If N is negative, the playhead will move backwards * abs(N) seconds. + * + * @property {function():boolean} isPaused + * Get if the current playback is paused. */ shaka.media.PlayRateController.Harness; diff --git a/lib/player.js b/lib/player.js index 21bd1ba59..90675b6d0 100644 --- a/lib/player.js +++ b/lib/player.js @@ -2725,6 +2725,20 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.mediaSourceEngine_ = mediaSourceEngine; } + /** + * @param {HTMLMediaElement} mediaElement + * @private + */ + setupPlayRateController_(mediaElement) { + this.playRateController_ = new shaka.media.PlayRateController({ + getRate: () => mediaElement.playbackRate, + getDefaultRate: () => mediaElement.defaultPlaybackRate, + setRate: (rate) => { mediaElement.playbackRate = rate; }, + movePlayhead: (delta) => { mediaElement.currentTime += delta; }, + isPaused: () => mediaElement.paused, + }); + } + /** * Adds the basic media listeners * @@ -2874,12 +2888,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.makeStateChangeEvent_('load'); const mediaElement = this.video_; - this.playRateController_ = new shaka.media.PlayRateController({ - getRate: () => mediaElement.playbackRate, - getDefaultRate: () => mediaElement.defaultPlaybackRate, - setRate: (rate) => { mediaElement.playbackRate = rate; }, - movePlayhead: (delta) => { mediaElement.currentTime += delta; }, - }); + this.setupPlayRateController_(mediaElement); // Add all media element listeners. this.addBasicMediaListeners_(mediaElement, startTimeOfLoad); @@ -3253,12 +3262,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget { this.playheadObservers_ = this.createPlayheadObserversForSrcEquals_(this.startTime_ || 0); - this.playRateController_ = new shaka.media.PlayRateController({ - getRate: () => mediaElement.playbackRate, - getDefaultRate: () => mediaElement.defaultPlaybackRate, - setRate: (rate) => { mediaElement.playbackRate = rate; }, - movePlayhead: (delta) => { mediaElement.currentTime += delta; }, - }); + this.setupPlayRateController_(mediaElement); this.startBufferManagement_(mediaElement, /* srcEquals= */ true); diff --git a/test/media/play_rate_controller_unit.js b/test/media/play_rate_controller_unit.js index 0f43fe04a..03cbc75a3 100644 --- a/test/media/play_rate_controller_unit.js +++ b/test/media/play_rate_controller_unit.js @@ -13,6 +13,8 @@ describe('PlayRateController', () => { let setPlayRateSpy; /** @type {!jasmine.Spy} */ let movePlayheadSpy; + /** @type {!jasmine.Spy} */ + let isPausedSpy; /** @type {number} */ let playRate; @@ -25,6 +27,7 @@ describe('PlayRateController', () => { getDefaultPlayRateSpy = jasmine.createSpy('getDefaultPlaybackRate'); setPlayRateSpy = jasmine.createSpy('setPlaybackRate'); movePlayheadSpy = jasmine.createSpy('movePlayhead'); + isPausedSpy = jasmine.createSpy('isPaused'); playRate = 1; @@ -32,12 +35,14 @@ describe('PlayRateController', () => { setPlayRateSpy.and.callFake((rate) => { playRate = rate; }); + isPausedSpy.and.callFake(() => false); const harness = { getRate: shaka.test.Util.spyFunc(getPlayRateSpy), getDefaultRate: shaka.test.Util.spyFunc(getDefaultPlayRateSpy), setRate: shaka.test.Util.spyFunc(setPlayRateSpy), movePlayhead: shaka.test.Util.spyFunc(movePlayheadSpy), + isPaused: shaka.test.Util.spyFunc(isPausedSpy), }; controller = new shaka.media.PlayRateController(harness);