package com.clayui.data
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.media.ID3Info;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundLoaderContext;
import flash.media.SoundTransform;
import flash.net.URLRequest;
import flash.utils.ByteArray;
/**
* 声音代理对像,用于代理声音对像,因为声音play调用一次将产生新的 SoundChannel,而引用它可能存在内存问题;
* @author crl
*
*/
public class SoundEntity extends EventDispatcher{
/**
* 尽量用Soundentry的play而不直接使用sound的,便于管理channel;
*/
private var _sound:Sound;
/**
* 声音管理控制类
**/
private var _channel:SoundChannel;
/**
* 循环播放次数;
*/
private var _loops:int;
/**
* 剩余循环次数;
*/
private var _leftLoops:int;
/**
* 声音唯一标识
**/
private var _key:String;
/**
* 播放到的位置
**/
private var _position:int;
/**
* 音量
**/
private var _volume:int;
/**
* 播放停止控制状态变量
**/
private var _pause:Boolean;
/**
*
* @param sound 代理的声音对像;
* @param key 标识;
*
*/
public function SoundEntity(sound:Sound,key:String):void{
_sound=sound;
_key=key;
}
public function get key():String{
return _key;
}
public function getNewSoundChannel(startTime:int=0,loops:int=0,sndTransform:SoundTransform=null):SoundChannel
{
_channel = _sound.play(startTime,loops,sndTransform);
return _channel;
}
public function play(startTime:int=0,loops:int=0,sndTransform:SoundTransform=null):void{
this.loops=loops;
if(_channel){
_channel.stop();
_channel.removeEventListener(Event.SOUND_COMPLETE,soundCompleteHandler);
}
_channel=_sound.play(startTime,loops,sndTransform);
if(_channel==null){
//没有扬声器时或其它故障;
return;
}
_channel.addEventListener(Event.SOUND_COMPLETE,soundCompleteHandler,false,0,true);
_pause=false;
}
/**
* 用于处理以段MP3播放完成的操作(如:循环播放、换)
**/
private function soundCompleteHandler(event:Event):void{
_leftLoops--;
if(_leftLoops<=0){
_channel.stop();
_channel.removeEventListener(Event.SOUND_COMPLETE,soundCompleteHandler);
this.dispatchEvent(event.clone());
}
}
/**
* 停止
*
*/
public function stop():void{
if(_channel==null){
return;
}
_channel.stop();
_pause=true;
_position=_channel.position;
}
/**
* 暂停/继续;
*
*/
public function pause():void{
if(_channel==null){
return;
}
_pause=!_pause;
if(_pause){
_position=_channel.position;
_channel.stop();
}else{
_channel.stop();
_channel.removeEventListener(Event.SOUND_COMPLETE,soundCompleteHandler);
_channel=_sound.play(_position,loops,_channel.soundTransform);
_channel.addEventListener(Event.SOUND_COMPLETE,soundCompleteHandler,false,0,true);
}
}
/**
* 设置音量;
* @param value
*
*/
public function set volume(value:Number):void{
if(_channel==null){
return;
}
var soundTransform:SoundTransform=_channel.soundTransform;
soundTransform.volume=value;
_channel.soundTransform=soundTransform;
}
/**
* 取得音量;
* @return
*
*/
public function get volume():Number{
if(_channel==null){
return -1;
}
return _channel.soundTransform.volume;
}
/**
* 重复次数;
* @param value
*
*/
public function set loops(value:int):void{
_leftLoops=_loops=value;
}
public function get loops():int{
return _loops;
}
//代理sound对像;
public function close():void{
_sound.close();
}
public function load(stream:URLRequest, context:SoundLoaderContext = null):void{
_sound.load(stream,context);
}
public function extract(target:ByteArray, length:Number, startPosition:Number = -1):Number{
return _sound.extract(target,length,startPosition);
}
public function get id3():ID3Info{
return _sound.id3;
}
public function get bytesLoaded():uint{
return _sound.bytesLoaded;
}
public function get bytesTotal():int{
return _sound.bytesTotal;
}
public function get length():Number{
return _sound.length;
}
public function get isBuffering():Boolean{
return _sound.isBuffering;
}
public function get url():String{
return _sound.url;
}
//代理soundChannel;
public function get position():Number{
if(_channel)return _channel.position;
return -1;
}
public function get soundTransform():SoundTransform{
if(_channel==null){
return null;
}
return _channel.soundTransform;
}
public function get leftPeak():Number{
if(_channel==null){
return 0;
}
return _channel.leftPeak;
}
public function get rightPeak():Number{
if(_channel==null){
return 0;
}
return _channel.rightPeak;
}
}
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.media.ID3Info;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundLoaderContext;
import flash.media.SoundTransform;
import flash.net.URLRequest;
import flash.utils.ByteArray;
/**
* 声音代理对像,用于代理声音对像,因为声音play调用一次将产生新的 SoundChannel,而引用它可能存在内存问题;
* @author crl
*
*/
public class SoundEntity extends EventDispatcher{
/**
* 尽量用Soundentry的play而不直接使用sound的,便于管理channel;
*/
private var _sound:Sound;
/**
* 声音管理控制类
**/
private var _channel:SoundChannel;
/**
* 循环播放次数;
*/
private var _loops:int;
/**
* 剩余循环次数;
*/
private var _leftLoops:int;
/**
* 声音唯一标识
**/
private var _key:String;
/**
* 播放到的位置
**/
private var _position:int;
/**
* 音量
**/
private var _volume:int;
/**
* 播放停止控制状态变量
**/
private var _pause:Boolean;
/**
*
* @param sound 代理的声音对像;
* @param key 标识;
*
*/
public function SoundEntity(sound:Sound,key:String):void{
_sound=sound;
_key=key;
}
public function get key():String{
return _key;
}
public function getNewSoundChannel(startTime:int=0,loops:int=0,sndTransform:SoundTransform=null):SoundChannel
{
_channel = _sound.play(startTime,loops,sndTransform);
return _channel;
}
public function play(startTime:int=0,loops:int=0,sndTransform:SoundTransform=null):void{
this.loops=loops;
if(_channel){
_channel.stop();
_channel.removeEventListener(Event.SOUND_COMPLETE,soundCompleteHandler);
}
_channel=_sound.play(startTime,loops,sndTransform);
if(_channel==null){
//没有扬声器时或其它故障;
return;
}
_channel.addEventListener(Event.SOUND_COMPLETE,soundCompleteHandler,false,0,true);
_pause=false;
}
/**
* 用于处理以段MP3播放完成的操作(如:循环播放、换)
**/
private function soundCompleteHandler(event:Event):void{
_leftLoops--;
if(_leftLoops<=0){
_channel.stop();
_channel.removeEventListener(Event.SOUND_COMPLETE,soundCompleteHandler);
this.dispatchEvent(event.clone());
}
}
/**
* 停止
*
*/
public function stop():void{
if(_channel==null){
return;
}
_channel.stop();
_pause=true;
_position=_channel.position;
}
/**
* 暂停/继续;
*
*/
public function pause():void{
if(_channel==null){
return;
}
_pause=!_pause;
if(_pause){
_position=_channel.position;
_channel.stop();
}else{
_channel.stop();
_channel.removeEventListener(Event.SOUND_COMPLETE,soundCompleteHandler);
_channel=_sound.play(_position,loops,_channel.soundTransform);
_channel.addEventListener(Event.SOUND_COMPLETE,soundCompleteHandler,false,0,true);
}
}
/**
* 设置音量;
* @param value
*
*/
public function set volume(value:Number):void{
if(_channel==null){
return;
}
var soundTransform:SoundTransform=_channel.soundTransform;
soundTransform.volume=value;
_channel.soundTransform=soundTransform;
}
/**
* 取得音量;
* @return
*
*/
public function get volume():Number{
if(_channel==null){
return -1;
}
return _channel.soundTransform.volume;
}
/**
* 重复次数;
* @param value
*
*/
public function set loops(value:int):void{
_leftLoops=_loops=value;
}
public function get loops():int{
return _loops;
}
//代理sound对像;
public function close():void{
_sound.close();
}
public function load(stream:URLRequest, context:SoundLoaderContext = null):void{
_sound.load(stream,context);
}
public function extract(target:ByteArray, length:Number, startPosition:Number = -1):Number{
return _sound.extract(target,length,startPosition);
}
public function get id3():ID3Info{
return _sound.id3;
}
public function get bytesLoaded():uint{
return _sound.bytesLoaded;
}
public function get bytesTotal():int{
return _sound.bytesTotal;
}
public function get length():Number{
return _sound.length;
}
public function get isBuffering():Boolean{
return _sound.isBuffering;
}
public function get url():String{
return _sound.url;
}
//代理soundChannel;
public function get position():Number{
if(_channel)return _channel.position;
return -1;
}
public function get soundTransform():SoundTransform{
if(_channel==null){
return null;
}
return _channel.soundTransform;
}
public function get leftPeak():Number{
if(_channel==null){
return 0;
}
return _channel.leftPeak;
}
public function get rightPeak():Number{
if(_channel==null){
return 0;
}
return _channel.rightPeak;
}
}
}