Skip navigation
mememellowcore11
Currently Being Moderated

xml playlist loading lag when new song is chosen

Jul 24, 2012 9:33 PM

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

 
Replies
  • kglad
    62,147 posts
    Jul 21, 2002
    Currently Being Moderated
    Jul 24, 2012 10:48 PM   in reply to mememellowcore11

    if a sound is still loading (use the complete event), you can use the sound class'es close() method to stop the download.

     
    |
    Mark as:
  • kglad
    62,147 posts
    Jul 21, 2002
    Currently Being Moderated
    Jul 26, 2012 11:15 PM   in reply to mememellowcore11

    :

     

     

    var loading:Boolean;

     

    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();

        }

    if(loading){

    snd.close();

    }

        snd = new Sound();

    snd.addEventListener(Event.COMPLETE,loadcompleteF);

    loading=true;

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

    }

    function loadcompleteF(e:Event):void{

    loading=false;

    }

    //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

     
    |
    Mark as:
  • kglad
    62,147 posts
    Jul 21, 2002
    Currently Being Moderated
    Jul 30, 2012 2:37 PM   in reply to mememellowcore11

    you need to use snd.close() on each stream that's still loading.  that should happen if you use the code i suggested and that looks like the code you're using.

     

    if you're using no other code, other than what you've shown, there's should be no time when 2 or more streams are loading at the same time.

     

    however, you mention "Here's CD stop #2's code" and something about other CD stops.  what do you mean by that?

     
    |
    Mark as:

More Like This

  • Retrieving data ...

Bookmarked By (0)