xml playlist loading lag when new song is chosen
My site has multiple xml playlists for individual CD icons. When a song is chosen it loads well and plays, however, when a new song is chosen while the initial choice plays, the first song stops as expected, but the next song has long lags (not always) before it loads and plays. It does eventually load and play. I suspect the new song won't load until the first song completes its load. How can I code a stop load if this is indeed what is occuring. Here's the initial xml code I am using:
var snd:Sound;
var channel:SoundChannel;
var trans:SoundTransform;
//create variables to store values for the current song and it's volume.
var currSong:String;
var currVol:Number = .5;
var songCount:int = 0;
var songNum:int = 0;
var songList_XML:XML;
var xmlReq:URLRequest = new URLRequest("songlist.xml");
var xmlLoader:URLLoader = new URLLoader();
var songList2_XML:XML;
var xmlReq2:URLRequest = new URLRequest("songlist2.xml");
var xmlLoader2:URLLoader = new URLLoader();
var songList3_XML:XML;
var xmlReq3:URLRequest = new URLRequest("songlist3.xml");
var xmlLoader3:URLLoader = new URLLoader();
var songList4_XML:XML;
var xmlReq4:URLRequest = new URLRequest("songlist4.xml");
var xmlLoader4:URLLoader = new URLLoader();
var songList5_XML:XML;
var xmlReq5:URLRequest = new URLRequest("songlist5.xml");
var xmlLoader5:URLLoader = new URLLoader();
var songList6_XML:XML;
var xmlReq6:URLRequest = new URLRequest("songlist6.xml");
var xmlLoader6:URLLoader = new URLLoader();
var songList7_XML:XML;
var xmlReq7:URLRequest = new URLRequest("songlist7.xml");
var xmlLoader7:URLLoader = new URLLoader();
if (snd != null) {
channel.stop();
}
Here is code from one of the CD's stops:
xmlLoader.load(xmlReq);
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
function errorHandler(event:IOErrorEvent):void {
songTitle.text = "XML loading error: " + event;
}
function xmlLoaded(event:Event):void {
songList_XML = new XML(xmlLoader.data);
song1.addEventListener(MouseEvent.CLICK, chooseSong);
song2.addEventListener(MouseEvent.CLICK, chooseSong);
song3.addEventListener(MouseEvent.CLICK, chooseSong);
song4.addEventListener(MouseEvent.CLICK, chooseSong);
song5.addEventListener(MouseEvent.CLICK, chooseSong);
song6.addEventListener(MouseEvent.CLICK, chooseSong);
song7.addEventListener(MouseEvent.CLICK, chooseSong);
song8.addEventListener(MouseEvent.CLICK, chooseSong);
song9.addEventListener(MouseEvent.CLICK, chooseSong);
song10.addEventListener(MouseEvent.CLICK, chooseSong);
song11.addEventListener(MouseEvent.CLICK, chooseSong);
song12.addEventListener(MouseEvent.CLICK, chooseSong);
setSongs();
}
//sets the text field of all of the song buttons to display the names of the songs in the songList array
function setSongs():void {
for(var i = 0; i < 12; i++) {
var titleText:String = songList_XML.song[i + songCount].name;
var clipTitle = this["song" + (i + 1)].title;
clipTitle.text = titleText;
}
}
volSlide.addEventListener(SliderEvent.CHANGE, volumeChange);
//switch statement to set the current song based on which song button was clicked.
function chooseSong(e:MouseEvent):void {
switch (e.currentTarget.name) {
case "song1":
//sets the currSong based on the XML file
// the songNum variable is based on which button was selected
songNum = 0;
//the songCount variable makes it possible to have more songs in the XML file than buttons on the interface. songCount is incremented when the user clicks the moreSongs button onstage.
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song2":
songNum = 1;
currSong = songList_XML.song[songNum+songCount].file;
break;
case "song3":
songNum = 2;
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song4":
songNum = 3;
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song5":
songNum = 4;
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song6":
songNum = 5;
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song7":
songNum = 6;
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song8":
songNum = 7;
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song9":
songNum = 8;
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song10":
songNum = 9;
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song11":
songNum = 10;
currSong = songList_XML.song[songNum + songCount].file;
break;
case "song12":
songNum = 11;
currSong = songList_XML.song[songNum + songCount].file;
break;
}
if (snd != null) {
channel.stop();
}
snd = new Sound();
snd.load(new URLRequest(currSong));
channel = new SoundChannel ;
trans = new SoundTransform(currVol);
channel = snd.play();
channel.soundTransform = trans;
volSlide.visible = true;
//currVolume and pan values are used here for display in the text fields next to sliders
volLabel.text = "Current Volume " + int(currVol * 100);
//listens for arrival of ID3 tags
snd.addEventListener(Event.ID3, id3Handler);
}
//triggered when id3 tags are available
//sets info text field to display current song information from id3 tags.
function id3Handler(event:Event):void {
var id3:ID3Info = snd.id3;
if (id3.songName != null) {
songTitle.text = id3.songName + "\n";
}
}
// uses volume slider value to control volume
function volumeChange(e:SliderEvent):void {
currVol = e.target.value;
volLabel.text = "Current Volume: " + int(currVol*100);
trans.volume = currVol;
channel.soundTransform = trans;
}
If it is not what I suspect please point me in the right direction. Any help with this is greatly appreciated.
mellowcore