Skip to content

Commit

Permalink
Reset transmuxer on audio-tracks-updated to handle audio group track …
Browse files Browse the repository at this point in the history
…switching

Resolves #3741
  • Loading branch information
Rob Walch committed Apr 8, 2021
1 parent a8fad5a commit 884456d
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 26 deletions.
2 changes: 2 additions & 0 deletions api-extractor/report/hls.js.api.md
Expand Up @@ -81,6 +81,8 @@ export interface AudioTrackSwitchedData {
//
// @public (undocumented)
export interface AudioTrackSwitchingData {
// (undocumented)
groupId: string;
// (undocumented)
id: number;
// (undocumented)
Expand Down
9 changes: 3 additions & 6 deletions src/controller/audio-stream-controller.ts
Expand Up @@ -7,7 +7,6 @@ import { FragmentState } from './fragment-tracker';
import { Level } from '../types/level';
import { PlaylistLevelType } from '../types/loader';
import { Fragment, ElementaryStreamTypes, Part } from '../loader/fragment';
import FragmentLoader from '../loader/fragment-loader';
import ChunkCache from '../demux/chunk-cache';
import TransmuxerInterface from '../demux/transmuxer-interface';
import type { TransmuxerResult } from '../types/transmuxer';
Expand Down Expand Up @@ -364,6 +363,7 @@ class AudioStreamController
event: Events.AUDIO_TRACKS_UPDATED,
{ audioTracks }: AudioTracksUpdatedData
) {
this.resetTransmuxer();
this.levels = audioTracks.map((mediaPlaylist) => new Level(mediaPlaylist));
}

Expand All @@ -374,7 +374,7 @@ class AudioStreamController
// if any URL found on new audio track, it is an alternate audio track
const altAudio = !!data.url;
this.trackId = data.id;
const { fragCurrent, transmuxer } = this;
const { fragCurrent } = this;

if (fragCurrent?.loader) {
fragCurrent.loader.abort();
Expand All @@ -383,10 +383,7 @@ class AudioStreamController
this.clearWaitingFragment();
// destroy useless transmuxer when switching audio to main
if (!altAudio) {
if (transmuxer) {
transmuxer.destroy();
this.transmuxer = null;
}
this.resetTransmuxer();
} else {
// switching to audio track, start timer if not already started
this.setInterval(TICK_INTERVAL);
Expand Down
10 changes: 8 additions & 2 deletions src/controller/audio-track-controller.ts
Expand Up @@ -188,11 +188,17 @@ class AudioTrackController extends BasePlaylistController {

const lastTrack = tracks[this.trackId];
this.log(`Now switching to audio-track index ${newId}`);
const { id, name, type, url } = track;
const { id, groupId = '', name, type, url } = track;
this.trackId = newId;
this.trackName = name;
this.selectDefaultTrack = false;
this.hls.trigger(Events.AUDIO_TRACK_SWITCHING, { id, name, type, url });
this.hls.trigger(Events.AUDIO_TRACK_SWITCHING, {
id,
groupId,
name,
type,
url,
});
const hlsUrlParameters = this.switchParams(track.url, lastTrack?.details);
this.loadPlaylist(hlsUrlParameters);
}
Expand Down
17 changes: 9 additions & 8 deletions src/controller/base-stream-controller.ts
Expand Up @@ -121,10 +121,7 @@ export default class BaseStreamController
if (frag) {
this.fragmentTracker.removeFragment(frag);
}
if (this.transmuxer) {
this.transmuxer.destroy();
this.transmuxer = null;
}
this.resetTransmuxer();
this.fragCurrent = null;
this.fragPrevious = null;
this.clearInterval();
Expand Down Expand Up @@ -1228,10 +1225,7 @@ export default class BaseStreamController
this.warn(
`Could not parse fragment ${frag.sn} ${type} duration reliably (${parsedDuration}) resetting transmuxer to fallback to playlist timing`
);
if (this.transmuxer) {
this.transmuxer.destroy();
this.transmuxer = null;
}
this.resetTransmuxer();
return result || false;
}
const drift = partial
Expand Down Expand Up @@ -1269,6 +1263,13 @@ export default class BaseStreamController
}
}

protected resetTransmuxer() {
if (this.transmuxer) {
this.transmuxer.destroy();
this.transmuxer = null;
}
}

set state(nextState) {
const previousState = this._state;
if (previousState !== nextState) {
Expand Down
7 changes: 0 additions & 7 deletions src/controller/stream-controller.ts
Expand Up @@ -715,13 +715,6 @@ export default class StreamController
);
}

private resetTransmuxer() {
if (this.transmuxer) {
this.transmuxer.destroy();
this.transmuxer = null;
}
}

private onAudioTrackSwitching(
event: Events.AUDIO_TRACK_SWITCHING,
data: AudioTrackSwitchingData
Expand Down
1 change: 0 additions & 1 deletion src/controller/subtitle-stream-controller.ts
Expand Up @@ -5,7 +5,6 @@ import { findFragmentByPDT, findFragmentByPTS } from './fragment-finders';
import type { FragmentTracker } from './fragment-tracker';
import { FragmentState } from './fragment-tracker';
import BaseStreamController, { State } from './base-stream-controller';
import FragmentLoader from '../loader/fragment-loader';
import { PlaylistLevelType } from '../types/loader';
import { Level } from '../types/level';
import type { NetworkComponentAPI } from '../types/component-api';
Expand Down
10 changes: 8 additions & 2 deletions src/controller/subtitle-track-controller.ts
Expand Up @@ -354,8 +354,14 @@ class SubtitleTrackController extends BasePlaylistController {
this.log(`Switching to subtitle track ${newId}`);
this.trackId = newId;
if (track) {
const { id, name, type, url } = track;
this.hls.trigger(Events.SUBTITLE_TRACK_SWITCH, { id, name, type, url });
const { id, groupId = '', name, type, url } = track;
this.hls.trigger(Events.SUBTITLE_TRACK_SWITCH, {
id,
groupId,
name,
type,
url,
});
const hlsUrlParameters = this.switchParams(track.url, lastTrack?.details);
this.loadPlaylist(hlsUrlParameters);
} else {
Expand Down
2 changes: 2 additions & 0 deletions src/types/events.ts
Expand Up @@ -155,6 +155,7 @@ export interface LevelPTSUpdatedData {
export interface AudioTrackSwitchingData {
id: number;
name: string;
groupId: string;
type: MediaPlaylistType | 'main';
url: string;
}
Expand All @@ -176,6 +177,7 @@ export interface SubtitleTracksUpdatedData {
export interface SubtitleTrackSwitchData {
id: number;
name?: string;
groupId?: string;
type?: MediaPlaylistType | 'main';
url?: string;
}
Expand Down

0 comments on commit 884456d

Please sign in to comment.