/***************************************************** * * Copyright 2009 Akamai Technologies, Inc. All Rights Reserved. * ***************************************************** * The contents of this file are subject to the Mozilla Public License * Version 1.1 (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.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * * The Initial Developer of the Original Code is Akamai Technologies, Inc. * Portions created by Akamai Technologies, Inc. are Copyright (C) 2009 Akamai * Technologies, Inc. All Rights Reserved. * * Contributor(s): Adobe Systems Incorporated. * *****************************************************/ package org.osmf.traits { import flash.errors.IllegalOperationError; import org.osmf.events.DynamicStreamEvent; import org.osmf.utils.OSMFStrings; /** * Dispatched when a stream switch is requested, completed, or failed. * * @eventType org.osmf.events.DynamicStreamEvent.SWITCHING_CHANGE * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion OSMF 1.0 */ [Event(name="switchingChange",type="org.osmf.events.DynamicStreamEvent")] /** * Dispatched when the number of dynamic streams has changed. * * @eventType org.osmf.events.DynamicStreamEvent.NUM_DYNAMIC_STREAMS_CHANGE * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion OSMF 1.0 */ [Event(name="numDynamicStreamsChange",type="org.osmf.events.DynamicStreamEvent")] /** * Dispatched when the autoSwitch property changed. * * @eventType org.osmf.events.DynamicStreamEvent.AUTO_SWITCH_CHANGE * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion OSMF 1.0 */ [Event(name="autoSwitchChange",type="org.osmf.events.DynamicStreamEvent")] /** * DynamicStreamTrait defines the trait interface for media supporting dynamic stream * switching. It can also be used as the base class for a more specific DynamicStreamTrait * subclass. * *
Use the MediaElement.hasTrait(MediaTraitType.DYNAMIC_STREAM)
method to query
* whether a media element has a trait of this type.
* If hasTrait(MediaTraitType.DYNAMIC_STREAM)
returns true
,
* use the MediaElement.getTrait(MediaTraitType.DYNAMIC_STREAM)
method
* to get an object of this type.
switchTo
* method can be used to manually switch to a specific stream.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public function get autoSwitch():Boolean
{
return _autoSwitch;
}
public final function set autoSwitch(value:Boolean):void
{
if (autoSwitch != value)
{
autoSwitchChangeStart(value);
_autoSwitch = value;
autoSwitchChangeEnd();
}
}
/**
* The total number of dynamic streams.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public function get numDynamicStreams():int
{
return _numDynamicStreams;
}
/**
* The index of the current dynamic stream. Uses a zero-based index.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public function get currentIndex():int
{
return _currentIndex;
}
/**
* The maximum allowed index. This can be set at run-time to
* provide a ceiling for the switching profile, for example,
* to keep from switching up to a higher quality stream when
* the current video is too small to handle a higher quality stream.
*
* The default is the highest stream index.
*
* @throws RangeError If the specified index is less than zero or
* greater than the total number of dynamic streams.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public function get maxAllowedIndex():int
{
return _maxAllowedIndex;
}
public final function set maxAllowedIndex(value:int):void
{
if (value < 0 || value > _numDynamicStreams - 1)
{
throw new RangeError(OSMFStrings.getString(OSMFStrings.STREAMSWITCH_INVALID_INDEX));
}
if (maxAllowedIndex != value)
{
maxAllowedIndexChangeStart(value);
_maxAllowedIndex = value;
maxAllowedIndexChangeEnd();
}
}
/**
* Returns the associated bitrate, in kilobits per second, for the specified index.
*
* @throws RangeError If the specified index is less than zero or
* greater than the highest index available.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public function getBitrateForIndex(index:int):Number
{
if (index > _numDynamicStreams - 1 || index < 0)
{
throw new RangeError(OSMFStrings.getString(OSMFStrings.STREAMSWITCH_INVALID_INDEX));
}
return 0;
}
/**
* Indicates whether or not a switch is currently in progress.
* This property will return true
while a switch has been
* requested and the switch has not yet been acknowledged and no switch failure
* has occurred. Once the switch request has been acknowledged or a
* failure occurs, the property will return false
.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public function get switching():Boolean
{
return _switching;
}
/**
* Switch to a specific index. To switch up, use the currentIndex
* property, such as:
*
* obj.switchTo(obj.currentIndex + 1);
*
*
maxAllowedIndex
.
* Note: If the media is paused, switching will not take place until after play resumes.
* @throws IllegalOperationError If the stream is not in manual switch mode.
*
* @see maxAllowedIndex
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
public function switchTo(index:int):void
{
if (autoSwitch)
{
throw new IllegalOperationError(OSMFStrings.getString(OSMFStrings.STREAMSWITCH_STREAM_NOT_IN_MANUAL_MODE));
}
else if (index != currentIndex)
{
if (index < 0 || index > maxAllowedIndex)
{
throw new RangeError(OSMFStrings.getString(OSMFStrings.STREAMSWITCH_INVALID_INDEX));
}
// This method sets the switching state to true. The processing
// and completion of the switch are up to the implementing media.
setSwitching(true, index);
}
}
// Internals
//
/**
* Invoking this setter will result in the trait's numDynamicStreams
* property changing.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
protected final function setNumDynamicStreams(value:int):void
{
if (value != _numDynamicStreams)
{
_numDynamicStreams = value;
// Only adjust our maxAllowedIndex property if the old value
// is now out of range.
if (maxAllowedIndex >= _numDynamicStreams)
{
maxAllowedIndex = Math.max(0, _numDynamicStreams - 1);
}
dispatchEvent(new DynamicStreamEvent(DynamicStreamEvent.NUM_DYNAMIC_STREAMS_CHANGE));
}
}
/**
* Invoking this setter will result in the trait's currentIndex
* property changing.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
protected final function setCurrentIndex(value:int):void
{
_currentIndex = value;
}
/**
* Must be called by the implementing media on completing a switch.
*
* Calls the switchingChangeStart()
and switchingChangeEnd()
* methods.
* @param newSwitching New switching
value for the trait.
* @param index The index to which the switch shall (or did) occur.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
protected final function setSwitching(newSwitching:Boolean, index:int):void
{
if (newSwitching != _switching)
{
switchingChangeStart(newSwitching, index);
_switching = newSwitching;
// Update the index when a switch finishes.
if (newSwitching == false)
{
setCurrentIndex(index);
}
switchingChangeEnd(index);
}
}
/**
* Called immediately before the autoSwitch
property is changed.
* Subclasses can override this method to communicate the change to the media.
* @param value New value for theautoSwitch
property.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
protected function autoSwitchChangeStart(value:Boolean):void
{
}
/**
* Called just after the autoSwitch
property has changed.
* Dispatches the change event.
*
* Subclasses that override should call this method to * dispatch the change event.
* * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion OSMF 1.0 */ protected function autoSwitchChangeEnd():void { dispatchEvent(new DynamicStreamEvent(DynamicStreamEvent.AUTO_SWITCH_CHANGE, false, false, false, _autoSwitch)); } /** * Called immediately before theswitching
property is changed.
* Subclasses can override this method to communicate the change to the media.
* @param newSwitching New value for theswitching
property.
* @param index The index of the stream to switch to.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
protected function switchingChangeStart(newSwitching:Boolean, index:int):void
{
}
/**
* Called just after the switching
property has changed.
* Dispatches the change event.
*
* Subclasses that override should call this method to * dispatch the change event.
* * @param index The index of the switched-to stream. * * @langversion 3.0 * @playerversion Flash 10 * @playerversion AIR 1.5 * @productversion OSMF 1.0 */ protected function switchingChangeEnd(index:int):void { dispatchEvent ( new DynamicStreamEvent ( DynamicStreamEvent.SWITCHING_CHANGE , false , false , switching ) ); } /** * Called immediately before themaxAllowedIndex
property is changed.
* Subclasses can override this method to communicate the change to the media.
* @param newIndex New value for themaxAllowedIndex
property.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
protected function maxAllowedIndexChangeStart(newIndex:int):void
{
}
/**
* Called just after the maxAllowedIndex
property has changed.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion OSMF 1.0
*/
protected function maxAllowedIndexChangeEnd():void
{
}
private var _autoSwitch:Boolean;
private var _currentIndex:int = 0;
private var _maxAllowedIndex:int = 0;
private var _numDynamicStreams:int;
private var _switching:Boolean;
}
}