/** * Copyright 2015 CANAL+ Group * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * /!\ This file is feature-switchable. * It always should be imported through the `features` object. */ import type { IMediaElement } from "../../compat/browser_compatibility_types"; import type { IAudioTrack, ITextTrack, IVideoTrack, IAvailableVideoTrack, IAvailableAudioTrack, IAvailableTextTrack } from "../../public_types"; import EventEmitter from "../../utils/event_emitter"; /** Events emitted by the MediaElementTracksStore. */ interface IMediaElementTracksStoreEvents { availableVideoTracksChange: IAvailableVideoTrack[]; availableAudioTracksChange: IAvailableAudioTrack[]; availableTextTracksChange: IAvailableTextTrack[]; videoTrackChange: IVideoTrack | null; audioTrackChange: IAudioTrack | null; textTrackChange: ITextTrack | null; } /** * Manage video, audio and text tracks for current direct file content. * @class MediaElementTracksStore */ export default class MediaElementTracksStore extends EventEmitter { /** List every available audio tracks available on the media element. */ private _audioTracks; /** List every available text tracks available on the media element. */ private _textTracks; /** List every available video tracks available on the media element. */ private _videoTracks; /** Last audio track emitted as active. */ private _lastEmittedNativeAudioTrack; /** Last video track emitted as active. */ private _lastEmittedNativeVideoTrack; /** Last text track emitted as active. */ private _lastEmittedNativeTextTrack; /** Native `AudioTrackList` implemented on the media element. */ private _nativeAudioTracks; /** Native `VideoTrackList` implemented on the media element. */ private _nativeVideoTracks; /** Native `TextTrackList` implemented on the media element. */ private _nativeTextTracks; /** * Last audio track manually set active through the corresponding * MediaElementTracksStore's API(s). * Allows to "lock on" a track, to be sure that choice will be kept even * through audio track list updates, as long as it is still available. * `null` if the audio track was disabled. * `undefined` if the audio track was not manually set. */ private _audioTrackLockedOn; /** * Last text track manually set active through the corresponding * MediaElementTracksStore's API(s). * Allows to "lock on" a track, to be sure that choice will be kept even * through text track list updates, as long as it is still available. * `null` if the text track was disabled. * `undefined` if the text track was not manually set. */ private _textTrackLockedOn; /** * Last video track manually set active through the corresponding * MediaElementTracksStore's API(s). * Allows to "lock on" a track, to be sure that choice will be kept even * through video track list updates, as long as it is still available. * `null` if the video track was disabled. * `undefined` if the video track was not manually set. */ private _videoTrackLockedOn; /** Task canceller that is cancel when the MediaTrackStore is disposed */ private taskCanceller; constructor(mediaElement: IMediaElement); /** * Update the currently active audio track by setting the wanted audio track's * ID property. * Throws if the wanted audio track is not found. * @param {string|number|undefined} id */ setAudioTrackById(id?: string | number): void; /** * Disable the currently-active text track, if one. */ disableTextTrack(): void; /** * Update the currently active text track by setting the wanted text track's * ID property. * Throws if the wanted text track is not found. * @param {string|number|undefined} id */ setTextTrackById(id?: string | number): void; /** * Disable the currently-active video track, if one. */ disableVideoTrack(): void; /** * Disable the currently-active audio track, if one. */ disableAudioTrack(): void; /** * Update the currently active video track by setting the wanted video track's * ID property. * Throws if the wanted video track is not found. * @param {string|number|undefined} id */ setVideoTrackById(id?: string | number): void; /** * Returns the currently active audio track. * Returns `null` if no audio track is active. * Returns `undefined` if we cannot know which audio track is active. * @returns {Object|null|undefined} */ getChosenAudioTrack(): IAudioTrack | null | undefined; /** * Returns the currently active text track. * Returns `null` if no text track is active. * Returns `undefined` if we cannot know which text track is active. * @returns {Object|null|undefined} */ getChosenTextTrack(): ITextTrack | null | undefined; /** * Returns the currently active video track. * Returns `null` if no video track is active. * Returns `undefined` if we cannot know which video track is active. * @returns {Object|null|undefined} */ getChosenVideoTrack(): IVideoTrack | null | undefined; /** * Returns a description of every available audio tracks. * @returns {Array.} */ getAvailableAudioTracks(): IAvailableAudioTrack[]; /** * Returns a description of every available text tracks. * @returns {Array.} */ getAvailableTextTracks(): IAvailableTextTrack[]; /** * Returns a description of every available video tracks. * @returns {Array.} */ getAvailableVideoTracks(): IAvailableVideoTrack[]; /** * Free the resources used by the MediaElementTracksStore. */ dispose(): void; /** * Get information about the currently chosen audio track. * `undefined` if we cannot know it. * `null` if no audio track is chosen. * @returns {Object|undefined|null} */ private _getCurrentAudioTrack; /** * Get information about the currently chosen video track. * `undefined` if we cannot know it. * `null` if no video track is chosen. * @returns {Object|undefined|null} */ private _getCurrentVideoTrack; /** * Get information about the currently chosen text track. * `undefined` if we cannot know it. * `null` if no text track is chosen. * @returns {Object|undefined|null} */ private _getCurrentTextTrack; /** * Iterate over every available audio tracks on the media element and either: * - if the last manually set audio track is found, set that one. * - if we still do not find an optimal track, let the one chosen by default */ private _setPreviouslyLockedAudioTrack; /** * Iterate over every available text tracks on the media element and either: * - if the last manually set text track is found, set that one. * - if we still do not find an optimal track, just disable it. */ private _setPreviouslyLockedTextTrack; /** * Iterate over every available video tracks on the media element and either: * - if the last manually set video track is found, set that one. * - if we still do not find an optimal track, let the one chosen by default */ private _setPreviouslyLockedVideoTrack; /** * Monitor native tracks add, remove and change callback and trigger the * change events. */ private _handleNativeTracksCallbacks; /** * Enable an audio track (and disable all others), based on its index in the * `this._audioTracks` array. * @param {number} index} */ private _enableAudioTrackFromIndex; } export {}; //# sourceMappingURL=media_element_tracks_store.d.ts.map