Files
moeplayer/source/org/mangui/osmf/plugins/traits/HLSAlternativeAudioTrait.as
T
2020-09-17 18:40:01 +08:00

120 lines
5.2 KiB
ActionScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mangui.osmf.plugins.traits {
import org.mangui.hls.HLS;
import org.mangui.hls.model.AudioTrack;
import org.mangui.hls.event.HLSEvent;
import org.osmf.events.AlternativeAudioEvent;
import org.osmf.media.MediaElement;
import org.osmf.net.StreamingItem;
import org.osmf.traits.AlternativeAudioTrait;
import org.osmf.utils.OSMFStrings;
CONFIG::LOGGING {
import org.mangui.hls.utils.Log;
}
public class HLSAlternativeAudioTrait extends AlternativeAudioTrait {
private var _hls : HLS;
private var _media : MediaElement;
private var _audioTrackList : Vector.<AudioTrack>;
private var _numAlternativeAudioStreams : int;
private var _activeTransitionIndex : int = DEFAULT_TRANSITION_INDEX;
private var _lastTransitionIndex : int = INVALID_TRANSITION_INDEX;
public function HLSAlternativeAudioTrait(hls : HLS, media : MediaElement) {
CONFIG::LOGGING {
Log.debug("HLSAlternativeAudioTrait()");
}
_hls = hls;
_audioTrackList = _hls.audioTracks;
_numAlternativeAudioStreams = _audioTrackList.length - 1;
super(_numAlternativeAudioStreams);
_media = media;
_hls.addEventListener(HLSEvent.AUDIO_TRACK_SWITCH, _audioTrackChangedHandler);
_hls.addEventListener(HLSEvent.AUDIO_TRACKS_LIST_CHANGE, _audioTrackListChangedHandler);
}
override public function dispose() : void {
CONFIG::LOGGING {
Log.debug("HLSAlternativeAudioTrait:dispose");
}
_hls.removeEventListener(HLSEvent.AUDIO_TRACK_SWITCH, _audioTrackChangedHandler);
_hls.removeEventListener(HLSEvent.AUDIO_TRACKS_LIST_CHANGE, _audioTrackListChangedHandler);
super.dispose();
}
override public function get numAlternativeAudioStreams() : int {
CONFIG::LOGGING {
Log.debug("HLSAlternativeAudioTrait:numAlternativeAudioStreams:" + _numAlternativeAudioStreams);
}
return _numAlternativeAudioStreams;
}
override public function getItemForIndex(index : int) : StreamingItem {
CONFIG::LOGGING {
Log.debug("HLSDynamicStreamTrait:getItemForIndex(" + index + ")");
}
if (index <= INVALID_TRANSITION_INDEX || index >= numAlternativeAudioStreams) {
throw new RangeError(OSMFStrings.getString(OSMFStrings.ALTERNATIVEAUDIO_INVALID_INDEX));
}
if (index == DEFAULT_TRANSITION_INDEX) {
return null;
}
var name : String = _audioTrackList[index + 1].title;
var streamItem : StreamingItem = new StreamingItem("AUDIO", name);
streamItem.info.label = name;
return streamItem;
}
override protected function endSwitching(index : int) : void {
CONFIG::LOGGING {
Log.debug("HLSDynamicStreamTrait:endSwitching(" + index + ")");
}
if (switching) {
executeSwitching(_indexToSwitchTo);
}
super.endSwitching(index);
}
protected function executeSwitching(indexToSwitchTo : int) : void {
CONFIG::LOGGING {
Log.debug("HLSDynamicStreamTrait:executeSwitching(" + indexToSwitchTo + ")");
}
if (_lastTransitionIndex != indexToSwitchTo) {
_activeTransitionIndex = indexToSwitchTo;
_hls.audioTrack = indexToSwitchTo + 1;
}
}
private function _audioTrackChangedHandler(event : HLSEvent) : void {
CONFIG::LOGGING {
Log.debug("HLSDynamicStreamTrait:_audioTrackChangedHandler");
}
setSwitching(false, _activeTransitionIndex);
_lastTransitionIndex = _activeTransitionIndex;
}
private function _audioTrackListChangedHandler(event : HLSEvent) : void {
CONFIG::LOGGING {
Log.debug("HLSDynamicStreamTrait:_audioTrackListChangedHandler");
}
_audioTrackList = _hls.audioTracks;
if (_audioTrackList.length > 0) {
// try to change default Audio Track Title for GrindPlayer ...
if (_audioTrackList[0].title.indexOf("TS/") == -1) {
CONFIG::LOGGING {
Log.debug("default audio track title:" + _audioTrackList[0].title);
}
_media.resource.addMetadataValue("defaultAudioLabel", _audioTrackList[0].title);
}
}
_numAlternativeAudioStreams = _audioTrackList.length - 1;
if (_numAlternativeAudioStreams > 0) {
dispatchEvent(new AlternativeAudioEvent(AlternativeAudioEvent.NUM_ALTERNATIVE_AUDIO_STREAMS_CHANGE, false, false, false));
}
}
}
}