home *** CD-ROM | disk | FTP | other *** search
- package classes.basic.Sound
- {
- import classes.basic.Events.TFEvent;
- import classes.basic.StateMachine.*;
- import flash.events.Event;
- import flash.media.Sound;
- import flash.media.SoundChannel;
- import flash.media.SoundTransform;
-
- public class TFSoundChannel
- {
-
- private static var iNumChannels:Number = 0;
-
- internal static var EVENT_STOP:String = "EVENT_STOP";
-
- private static var MAX_CHANNELS:Number = 32;
-
- public static var TYPE_MUSIC:Number = 0;
-
- internal static var ST_STOPPED:String = "ST_STOPPED";
-
- internal static var ST_PLAYING:String = "ST_PLAYING";
-
- public static var TYPE_SFX:Number = 1;
-
- internal static var ST_FADINGOUT:String = "ST_FADINGOUT";
-
- internal static var EVENT_PLAY:String = "EVENT_PLAY";
-
- internal static var ST_FADINGIN:String = "ST_FADINGIN";
-
-
- private var iType:Number;
-
- private var pSoundChannel:SoundChannel;
-
- private var iFadeInDuration:Number;
-
- private var iCurrentVolume:Number;
-
- private var elapsedFadeTime:Number;
-
- private var iVolume:Number;
-
- private var bLoop:Boolean;
-
- private var iFakeFadeOutDuration:Number;
-
- private var pEventCallback:Function;
-
- private var iFakeFadeInDuration:Number;
-
- private var stMachine:TFStateMachine;
-
- private var iFadeOutDuration:Number;
-
- private var pSound:Sound;
-
- public function TFSoundChannel(param1:Sound, param2:Number, param3:Function = null, param4:Boolean = false, param5:Number = 0, param6:Number = 0)
- {
- super();
- stMachine = new TFStateMachine(null);
- stMachine.createEvent(EVENT_PLAY,null);
- stMachine.createEvent(EVENT_STOP,null);
- stMachine.createState(ST_FADINGIN,false,this,startFadeIn,processFadeIn,null);
- stMachine.createState(ST_PLAYING,false,this,null,processPlay,null);
- stMachine.createState(ST_FADINGOUT,false,this,startFadeOut,processFadeOut,null);
- stMachine.createState(ST_STOPPED,false,this,startStopped,null,null);
- stMachine.createTransition(ST_STOPPED,EVENT_PLAY,ST_FADINGIN);
- stMachine.createTransition(ST_FADINGIN,EVENT_STOP,ST_STOPPED);
- stMachine.createTransition(ST_FADINGIN,EVENT_PLAY,ST_PLAYING);
- stMachine.createTransition(ST_PLAYING,EVENT_STOP,ST_FADINGOUT);
- stMachine.createTransition(ST_FADINGOUT,EVENT_STOP,ST_STOPPED);
- stMachine.createTransition(ST_PLAYING,EVENT_PLAY,ST_PLAYING);
- stMachine.initialize(ST_STOPPED);
- this.iType = param2;
- this.bLoop = param4;
- this.iFadeInDuration = param5;
- this.iFadeOutDuration = param6;
- this.pEventCallback = param3;
- pSound = param1;
- pSoundChannel = null;
- iVolume = 0;
- iCurrentVolume = 0;
- elapsedFadeTime = 0;
- }
-
- private function applyVolumeToChannel(param1:Number) : *
- {
- var _loc2_:SoundTransform = null;
- if(pSoundChannel == null)
- {
- return;
- }
- _loc2_ = pSoundChannel.soundTransform;
- _loc2_.volume = param1;
- pSoundChannel.soundTransform = _loc2_;
- }
-
- public function stop() : Boolean
- {
- if(pSoundChannel == null)
- {
- return false;
- }
- return stMachine.receiveEvent(EVENT_STOP);
- }
-
- private function startStopped() : *
- {
- if(pSoundChannel)
- {
- pSoundChannel.stop();
- pSoundChannel = null;
- --iNumChannels;
- }
- if(pEventCallback != null)
- {
- pEventCallback(new TFEvent(TFEvent.EVENT_STOP,this));
- }
- }
-
- private function startFadeIn() : *
- {
- pSoundChannel = pSound.play(0,bLoop == true ? 9999999 : 1);
- ++iNumChannels;
- if(pSoundChannel != null)
- {
- pSoundChannel.addEventListener(Event.SOUND_COMPLETE,soundCompleteHandler,false,0,true);
- if(iFadeInDuration == 0)
- {
- if(pEventCallback != null)
- {
- pEventCallback(new TFEvent(TFEvent.EVENT_FADEINBEGIN,this));
- }
- if(pEventCallback != null)
- {
- pEventCallback(new TFEvent(TFEvent.EVENT_FADEINEND,this));
- }
- applyVolumeToChannel(iVolume / 100);
- stMachine.receiveEvent(EVENT_PLAY);
- }
- else
- {
- applyVolumeToChannel(0);
- elapsedFadeTime = 0;
- if(pEventCallback != null)
- {
- pEventCallback(new TFEvent(TFEvent.EVENT_FADEINBEGIN,this));
- }
- }
- return;
- }
- soundCompleteHandler(null);
- }
-
- private function processFadeIn(param1:Object) : *
- {
- elapsedFadeTime += param1.time;
- if(elapsedFadeTime >= iFadeInDuration)
- {
- if(pEventCallback != null)
- {
- pEventCallback(new TFEvent(TFEvent.EVENT_FADEINEND,this));
- }
- applyVolumeToChannel(iVolume / 100);
- stMachine.receiveEvent(EVENT_PLAY);
- }
- else
- {
- applyVolumeToChannel(elapsedFadeTime * iVolume / iFadeInDuration / 100);
- }
- }
-
- private function processFadeOut(param1:Object) : *
- {
- elapsedFadeTime -= param1.time;
- if(elapsedFadeTime <= 0)
- {
- pSoundChannel.removeEventListener(Event.SOUND_COMPLETE,soundCompleteHandler);
- pSoundChannel.stop();
- pSoundChannel = null;
- --iNumChannels;
- if(pEventCallback != null)
- {
- pEventCallback(new TFEvent(TFEvent.EVENT_FADEOUTEND,this));
- }
- stMachine.receiveEvent(EVENT_STOP);
- }
- else
- {
- applyVolumeToChannel(elapsedFadeTime * iVolume / iFadeOutDuration / 100);
- }
- }
-
- private function soundCompleteHandler(param1:Event) : *
- {
- if(stMachine.getCurrentState().getName() == "ST_PLAYING")
- {
- stMachine.receiveEvent(EVENT_STOP);
- }
- }
-
- public function getState() : String
- {
- return stMachine.getCurrentState().getName();
- }
-
- public function setVolume(param1:Number) : *
- {
- iVolume = param1;
- if(Boolean(pSoundChannel) && stMachine.getCurrentState().getName() == ST_PLAYING)
- {
- applyVolumeToChannel(iVolume / 100);
- }
- }
-
- public function execFadeOut(param1:Number) : *
- {
- elapsedFadeTime = param1;
- this.iFakeFadeOutDuration = param1;
- }
-
- public function setFadeOutDuration(param1:Number) : *
- {
- this.iFadeOutDuration = param1;
- }
-
- private function processPlay(param1:Object) : *
- {
- if(iFakeFadeInDuration > 0)
- {
- elapsedFadeTime += param1.time;
- if(elapsedFadeTime >= iFakeFadeInDuration)
- {
- applyVolumeToChannel(iVolume / 100);
- iFakeFadeInDuration = 0;
- }
- else
- {
- applyVolumeToChannel(elapsedFadeTime * iVolume / iFakeFadeInDuration / 100);
- }
- }
- else if(iFakeFadeOutDuration > 0)
- {
- elapsedFadeTime -= param1.time;
- if(elapsedFadeTime <= 0)
- {
- applyVolumeToChannel(0);
- iFakeFadeOutDuration = 0;
- }
- else
- {
- applyVolumeToChannel(elapsedFadeTime * iVolume / iFakeFadeOutDuration / 100);
- }
- }
- if(iFadeOutDuration > 0 && !bLoop)
- {
- if(pSoundChannel.position >= pSound.length - iFadeOutDuration)
- {
- stMachine.receiveEvent(EVENT_STOP);
- }
- }
- }
-
- private function startFadeOut() : *
- {
- if(iFadeOutDuration == 0)
- {
- pSoundChannel.removeEventListener(Event.SOUND_COMPLETE,soundCompleteHandler);
- pSoundChannel.stop();
- pSoundChannel = null;
- --iNumChannels;
- if(pEventCallback != null)
- {
- pEventCallback(new TFEvent(TFEvent.EVENT_FADEOUTBEGIN,this));
- }
- if(pEventCallback != null)
- {
- pEventCallback(new TFEvent(TFEvent.EVENT_FADEOUTEND,this));
- }
- stMachine.receiveEvent(EVENT_STOP);
- }
- else
- {
- if(pEventCallback != null)
- {
- pEventCallback(new TFEvent(TFEvent.EVENT_FADEOUTBEGIN,this));
- }
- elapsedFadeTime = iFadeOutDuration;
- }
- }
-
- public function getType() : Number
- {
- return iType;
- }
-
- public function execFadeIn(param1:Number) : *
- {
- elapsedFadeTime = 0;
- this.iFakeFadeInDuration = param1;
- }
-
- public function play() : Boolean
- {
- if(pSoundChannel != null || iNumChannels >= MAX_CHANNELS)
- {
- return false;
- }
- return stMachine.receiveEvent(EVENT_PLAY);
- }
-
- public function process(param1:Object) : *
- {
- stMachine.process(param1);
- }
-
- public function setFadeInDuration(param1:Number) : *
- {
- this.iFadeInDuration = param1;
- }
- }
- }
-