Hoping someone can help me figure this out… In my app, scenes on the stage play based on user interaction, and are accompanied by sound clips that are loaded through a soundLoader class (see below). I can play the correct track from the model, but I can’t figure out how to correctly write a loadTracks function that will proload all of the track options for a given scene, and then play the correct one based on what the user clicks without a pause. How would I preload and store those sounds in a way that I can use them when needed?
Thanks in advance!
package mvc
{
import flash.display.*;
import flash.media.*;
import flash.events.*;
import flash.net.*;
import mvc.SceneView;
public class SoundLoader extends View
{
private var trackList:Array;
private var soundReq:URLRequest;
private var loader:Sound;
private var audioTrack:SoundChannel;
private var trackIndex:int = 0;
private var initialized:Boolean = false;
public var resumeTime:Number;
public var isPlaying:Boolean = false;
private var trackVolume:SoundTransform;
private var trackLength:Number;
private var autoContinue:Boolean;
private var nextScene:int;
public var local:Boolean;
private var soundContainer:Sprite;
private var stage:MovieClip;
private var counter:int = 0;
public function SoundLoader(_stage:MovieClip, tracks:Array, isLocal:Boolean = false)
{
stage = _stage;
local = isLocal;
trackList = tracks;
}
public function pauseTrack():void
{
resumeTime = audioTrack.position;
audioTrack.stop();
isPlaying = false;
}
public function playBtn():void
{
audioTrack = loader.play(resumeTime);
audioTrack.soundTransform = trackVolume;
isPlaying = true;
audioTrack.addEventListener(Event.SOUND_COMPLETE, trackFinished);
}
override public function findTrack(event:Event = null):void
{
if(model.currentQuestion.answer.attribute("auto")= ="true")
{
model.nextScene = model.currentQuestion.answer.attribute("goto");
changeTrack(model.currentIndex, true);
} else
{
changeTrack(model.currentIndex, false);
}
}
public function changeTrack(dir:int, auto:Boolean = false):void
{
autoContinue = auto;
trackIndex = dir;
if(trackIndex!=1)
{
if(audioTrack)
{
audioTrack.stop();
}
}
playCurrent();
}
private function playCurrent():void
{
soundReq = new URLRequest("assets/audio/"+trackList[trackIndex-1]+".mp3");
loader = new Sound();
loader.load(soundReq);
loader.addEventListener(Event.COMPLETE, trackLoaded);
}
private function loadTracks():void
{
if (local)
{
soundReq = new URLRequest("assets/audio/"+model.currentTrackOptions[counter]+".mp3");
} else
{
soundReq = new URLRequest("http://url"+model.currentTrackOptions[counter]+".mp3");
}
loader = new Sound();
loader.load(soundReq);
loader.addEventListener(Event.COMPLETE, trackPrepped);
}
private function trackPrepped(event:Event):void
{
counter++;
if (counter < model.currentTrackOptions.length)
{
loadTracks();
}
}
private function trackLoaded(event:Event):void
{
trackLength = loader.length;
resumeTime = 0;
audioTrack = loader.play();
audioTrack.stop();
if(isPlaying)
{
audioTrack = loader.play();
}
if(!initialized)
{
trackVolume = audioTrack.soundTransform;
initialized = true;
}
else
{
audioTrack.soundTransform = trackVolume;
}
//TELL MODEL THAT SOUND IS READY
model.soundReady();
audioTrack = loader.play();
audioTrack.addEventListener(Event.SOUND_COMPLETE, trackFinished);
}
private function trackFinished(event:Event):void
{
if (autoContinue)
{
model.setCurrentIndex(model.nextScene);
} else
{
model.sceneComplete();
}
}
public function setVol(vol:Number):void
{
trackVolume.volume = vol;
audioTrack.soundTransform = trackVolume;
}
public function getVol():Number
{
return trackVolume.volume;
}
public function getProg():Number
{
return audioTrack.position;
}
public function gettrackLength():Number
{
return trackLength;
}
public function setResumeTime(time:Number):void
{
resumeTime = time;
}
}
}