Skip to content

Audio and subtitles series

Audio and subtitle selection

Keeping track of tracks

The current PlaybackSession manages available and selected audio/subtitle tracks.

public interface IPlaybackSession {
    ...
    List<ISubtitleTrack> getSubtitleTracks();
    ISubtitleTrack getSelectedSubtitleTrack();

    List<IAudioTrack> getAudioTracks();
    IAudioTrack getSelectedAudioTrack();
    ...
}

The IPlaybackSessionListener interface also contains events for when these values change.

public interface IPlaybackSessionListener {
    ...
    void onSubtitleTracks(List<ISubtitleTrack> tracks);
    void onSelectedSubtitleTrackChanged(ISubtitleTrack oldSelectedTrack, ISubtitleTrack newSelectedTrack);

    void onAudioTracks(List<IAudioTrack> tracks);
    void onSelectedAudioTrackChanged(IAudioTrack oldSelectedTrack, IAudioTrack newSelectedTrack);
    ...
}

These events can be used to initiate and update UI elements.

Note

onSubtitleTracks(...) and onAudioTracks(...) can get called at any time. This is dependent on the current stream and the playerImplementation.

Example - Audio

In this example the variable audioTrackUi represents some object or callback used for updating the UI.

public void setupAudioSelector(IEnigmaPlayer enigmaPlayer) {
    enigmaPlayer.addListener(new BaseEnigmaPlayerListener() {
        //Listener for currently active PlaybackSession
        private final IPlaybackSessionListener activePlaybackSessionListener = new BasePlaybackSessionListener() {
            @Override
            public void onAudioTracks(List<IAudioTrack> tracks) {
                //Update UI
                audioTrackUi.setAvailableAudioLanguages(tracks);
            }

            @Override
            public void onSelectedAudioTrackChanged(IAudioTrack oldSelectedTrack, IAudioTrack newSelectedTrack) {
                //Update UI
                audioTrackUi.setSelectedAudioLanguage(newSelectedTrack);
            }
        };

        @Override
        public void onPlaybackSessionChanged(IPlaybackSession from, IPlaybackSession to) {
            if(from != null) {
                //Remove listener from old PlaybackSession
                from.removeListener(activePlaybackSessionListener);
            }
            if(to != null) {
                //Update UI
                audioTrackUi.setAvailableAudioLanguages(to.getAudioTracks());
                audioTrackUi.setSelectedAudioLanguage(to.getSelectedAudioTrack());

                //Add listener to new PlaybackSession
                to.addListener(activePlaybackSessionListener, handler);
            }
        }
    }, handler);
}

While this example is only for audio, the same pattern applies to subtitles as well.

Changing selected audio/subtitle track

To change the selected audio/subtitle track, simply send one of the available audio/subtitle track-objects into IEnigmaPlayerControls#set{Audio/Subtitle}Track(...).

public void selectSubtitleTrack(ISubtitleTrack subtitleTrack) {
    enigmaPlayer.getControls().setSubtitleTrack(subtitleTrack);
}

public void selectSubtitleTrack(String trackId) {
        enigmaPlayer.getControls().setSubtitleTrackById(trackId);
}

public void selectAudioTrack(IAudioTrack audioTrack) {
    enigmaPlayer.getControls().setAudioTrack(audioTrack);
}

public void selectAudioTrack(String trackId) {
        enigmaPlayer.getControls().setSubtitleTrackById(trackId);
}

To turn off subtitles, simply select null as the subtitle track.

public void turnOffSubtitles() {
    enigmaPlayer.getControls().setSubtitleTrack(null);
}

This is only allowed for subtitle tracks. A request to setAudioTrack(null) will be rejected.

Note

Objects passed to set{Audio/Subtitle}Track(...) must originate from EnigmaPlayer. Using a custom implementation of IAudioTrack or ISubtitleTrack will result in a rejected request.

Working example

Here is a working example project using what is described in this tutorial: audioAndSubtitles


Table of Contents
Prerequisites
• Audio and subtitle selection (current)