Skip to content

Commit

Permalink
Prevent texttrack-utils "hidden" mode change from activating subtitle…
Browse files Browse the repository at this point in the history
… tracks

#3987
  • Loading branch information
Rob Walch committed Jun 3, 2021
1 parent e677e12 commit 224bf76
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 23 deletions.
33 changes: 21 additions & 12 deletions src/controller/subtitle-track-controller.ts
Expand Up @@ -23,6 +23,7 @@ class SubtitleTrackController extends BasePlaylistController {
private selectDefaultTrack: boolean = true;
private queuedDefaultTrack: number = -1;
private trackChangeListener: () => void = () => this.onTextTracksChanged();
private asyncPollTrackChange: () => void = () => this.pollTrackChange(0);
private useTextTrackPolling: boolean = false;
private subtitlePollingInterval: number = -1;

Expand All @@ -37,8 +38,7 @@ class SubtitleTrackController extends BasePlaylistController {
this.unregisterListeners();
this.tracks.length = 0;
this.tracksInGroup.length = 0;
// @ts-ignore
this.trackChangeListener = null;
this.trackChangeListener = this.asyncPollTrackChange = null as any;
super.destroy();
}

Expand Down Expand Up @@ -85,29 +85,33 @@ class SubtitleTrackController extends BasePlaylistController {
this.media.textTracks && 'onchange' in this.media.textTracks
);
if (this.useTextTrackPolling) {
self.clearInterval(this.subtitlePollingInterval);
this.subtitlePollingInterval = self.setInterval(() => {
this.trackChangeListener();
}, 500);
this.pollTrackChange(500);
} else {
this.media.textTracks.addEventListener(
'change',
this.trackChangeListener
this.asyncPollTrackChange
);
}
}

private pollTrackChange(timeout: number) {
self.clearInterval(this.subtitlePollingInterval);
this.subtitlePollingInterval = self.setInterval(
this.trackChangeListener,
timeout
);
}

protected onMediaDetaching(): void {
if (!this.media) {
return;
}

if (this.useTextTrackPolling) {
self.clearInterval(this.subtitlePollingInterval);
} else {
self.clearInterval(this.subtitlePollingInterval);
if (!this.useTextTrackPolling) {
this.media.textTracks.removeEventListener(
'change',
this.trackChangeListener
this.asyncPollTrackChange
);
}

Expand Down Expand Up @@ -373,6 +377,9 @@ class SubtitleTrackController extends BasePlaylistController {
}

private onTextTracksChanged(): void {
if (!this.useTextTrackPolling) {
self.clearInterval(this.subtitlePollingInterval);
}
// Media is undefined when switching streams via loadSource()
if (!this.media || !this.hls.config.renderTextTracksNatively) {
return;
Expand All @@ -391,7 +398,9 @@ class SubtitleTrackController extends BasePlaylistController {
}

// Setting current subtitleTrack will invoke code.
this.subtitleTrack = trackId;
if (this.subtitleTrack !== trackId) {
this.subtitleTrack = trackId;
}
}
}

Expand Down
21 changes: 10 additions & 11 deletions src/utils/texttrack-utils.ts
Expand Up @@ -51,11 +51,10 @@ export function clearCurrentCues(track: TextTrack) {
if (mode === 'disabled') {
track.mode = 'hidden';
}
if (!track.cues) {
return;
}
for (let i = track.cues.length; i--; ) {
track.removeCue(track.cues[i]);
if (track.cues) {
for (let i = track.cues.length; i--; ) {
track.removeCue(track.cues[i]);
}
}
if (mode === 'disabled') {
track.mode = mode;
Expand All @@ -71,12 +70,12 @@ export function removeCuesInRange(
if (mode === 'disabled') {
track.mode = 'hidden';
}
if (!track.cues || !track.cues.length) {
return;
}
const cues = getCuesInRange(track.cues, start, end);
for (let i = 0; i < cues.length; i++) {
track.removeCue(cues[i]);

if (track.cues && track.cues.length > 0) {
const cues = getCuesInRange(track.cues, start, end);
for (let i = 0; i < cues.length; i++) {
track.removeCue(cues[i]);
}
}
if (mode === 'disabled') {
track.mode = mode;
Expand Down

0 comments on commit 224bf76

Please sign in to comment.