diff --git a/src/master-playlist-controller.js b/src/master-playlist-controller.js index abb1c5a24..96ea798e2 100644 --- a/src/master-playlist-controller.js +++ b/src/master-playlist-controller.js @@ -1346,9 +1346,6 @@ export class MasterPlaylistController extends videojs.EventTarget { if (usingAudioLoader && unsupportedAudio && this.media().attributes.AUDIO) { const audioGroup = this.media().attributes.AUDIO; - this.mediaTypes_.AUDIO.activePlaylistLoader.pause(); - this.audioSegmentLoader_.pause(); - this.audioSegmentLoader_.abort(); this.master().playlists.forEach(variant => { const variantAudioGroup = variant.attributes && variant.attributes.AUDIO; diff --git a/src/media-groups.js b/src/media-groups.js index ea5f71724..6941c9405 100644 --- a/src/media-groups.js +++ b/src/media-groups.js @@ -105,6 +105,17 @@ export const onGroupChanged = (type, settings) => () => { startLoaders(activeGroup.playlistLoader, mediaType); }; +export const onGroupChanging = (type, settings) => () => { + const { + segmentLoaders: { + [type]: segmentLoader + } + } = settings; + + segmentLoader.abort(); + segmentLoader.pause(); +}; + /** * Returns a function to be called when the media track changes. It performs a * destructive reset of the SegmentLoader to ensure we start loading as close to @@ -730,6 +741,7 @@ export const setupMediaGroups = (settings) => { mediaTypes[type].activeGroup = activeGroup(type, settings); mediaTypes[type].activeTrack = activeTrack[type](type, settings); mediaTypes[type].onGroupChanged = onGroupChanged(type, settings); + mediaTypes[type].onGroupChanging = onGroupChanging(type, settings); mediaTypes[type].onTrackChanged = onTrackChanged(type, settings); }); @@ -748,6 +760,10 @@ export const setupMediaGroups = (settings) => { ['AUDIO', 'SUBTITLES'].forEach(type => mediaTypes[type].onGroupChanged()); }); + masterPlaylistLoader.on('mediachanging', () => { + ['AUDIO', 'SUBTITLES'].forEach(type => mediaTypes[type].onGroupChanging()); + }); + // custom audio track change event handler for usage event const onAudioTrackChanged = () => { mediaTypes.AUDIO.onTrackChanged(); diff --git a/test/media-groups.test.js b/test/media-groups.test.js index 111453c00..ee3b5222a 100644 --- a/test/media-groups.test.js +++ b/test/media-groups.test.js @@ -340,6 +340,32 @@ QUnit.test('activeGroup returns the correct subtitle group', function(assert) { ); }); +QUnit.test('onGroupChanging aborts and pauses segment loaders', function(assert) { + const calls = { + abort: 0, + pause: 0 + }; + const segmentLoader = { + abort: () => calls.abort++, + pause: () => calls.pause++ + }; + + const settings = { + segmentLoaders: { + AUDIO: segmentLoader + } + }; + const type = 'AUDIO'; + + const onGroupChanging = MediaGroups.onGroupChanging(type, settings); + + assert.deepEqual(calls, {abort: 0, pause: 0}, 'no calls yet'); + + onGroupChanging(); + + assert.deepEqual(calls, {abort: 1, pause: 1}, 'one abort one pause'); +}); + QUnit.test( 'onGroupChanged updates active playlist loader and resyncs segment loader', function(assert) {