flash播放声音类

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;
}

}

}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值