diff --git a/src/controller/audio-track-controller.js b/src/controller/audio-track-controller.js index bad659c3cca..8667b2445aa 100644 --- a/src/controller/audio-track-controller.js +++ b/src/controller/audio-track-controller.js @@ -91,6 +91,8 @@ class AudioTrackController extends TaskLoop { onManifestParsed (data) { const tracks = this.tracks = data.audioTracks || []; this.hls.trigger(Event.AUDIO_TRACKS_UPDATED, { audioTracks: tracks }); + + this._selectAudioGroup(this.hls.nextLoadLevel); } /** @@ -150,20 +152,7 @@ class AudioTrackController extends TaskLoop { * @param {*} data */ onLevelLoaded (data) { - // FIXME: crashes because currentLevel is undefined - // const levelInfo = this.hls.levels[this.hls.currentLevel]; - - const levelInfo = this.hls.levels[data.level]; - - if (!levelInfo.audioGroupIds) { - return; - } - - const audioGroupId = levelInfo.audioGroupIds[levelInfo.urlId]; - if (this.audioGroupId !== audioGroupId) { - this.audioGroupId = audioGroupId; - this._selectInitialAudioTrack(); - } + this._selectAudioGroup(data.level); } /** @@ -252,6 +241,24 @@ class AudioTrackController extends TaskLoop { this._updateTrack(this._trackId); } + /** + * @param levelId + * @private + */ + _selectAudioGroup (levelId) { + const levelInfo = this.hls.levels[levelId]; + + if (!levelInfo || !levelInfo.audioGroupIds) { + return; + } + + const audioGroupId = levelInfo.audioGroupIds[levelInfo.urlId]; + if (this.audioGroupId !== audioGroupId) { + this.audioGroupId = audioGroupId; + this._selectInitialAudioTrack(); + } + } + /** * Select initial track * @private diff --git a/tests/unit/controller/audio-track-controller.js b/tests/unit/controller/audio-track-controller.js index 6ecae5db444..8956d220f1c 100644 --- a/tests/unit/controller/audio-track-controller.js +++ b/tests/unit/controller/audio-track-controller.js @@ -80,6 +80,42 @@ describe('AudioTrackController', function () { }); }); + it('should select audioGroupId and trigger AUDIO_TRACK_SWITCHING', function (done) { + hls.on(Hls.Events.AUDIO_TRACK_SWITCHING, (event, data) => { + done(); + }); + + const levels = [ + { + urlId: 1, + audioGroupIds: ['1', '2'] + } + ]; + + hls.levelController = { + levels + }; + + const newLevelInfo = levels[0]; + const newGroupId = newLevelInfo.audioGroupIds[newLevelInfo.urlId]; + + audioTrackController.audioGroupId = '1'; + audioTrackController.tracks = tracks; + audioTrackController.audioTrack = 2; + + // current track name + const audioTrackName = tracks[audioTrackController.audioTrack].name; + + audioTrackController.onManifestParsed({ + audioTracks: tracks + }); + + // group has switched + expect(audioTrackController.audioGroupId).to.equal(newGroupId); + // name is still the same + expect(tracks[audioTrackController.audioTrack].name).to.equal(audioTrackName); + }); + describe('_needsTrackLoading', function () { it('should not need loading because the audioTrack is embedded in the main playlist', function () { expect(audioTrackController._needsTrackLoading({ details: { live: true } })).to.be.false;