views:

761

answers:

2

Using ONE Sound() object in Actionscript3, how can I play a one MP3 and then, when the user chooses a different one, play a second sound, using the SAME Sound() object?

EDIT: See my answer for how I did it.

A: 

You cannot use same Sound object to play multiple files.

Once load() is called on a Sound object, you can't later load a different sound file into that Sound object. To load a different sound file, create a new Sound object.

Amarghosh
Actually, I fixed my problem. Technically you are right, but yes, I used one sound object to play multiple files. I will post the code here in a few minutes to show you how.
Moshe
A: 

Ok, I actually did it using the following code. My bug was somewhere else in the FLA file, but this works. I made an uninitialized global variable and created the Sound() object LOCALLY inside of a function. While I'm technically using multiple sound objects, my references are all pointing to ONE object. Additionally, I can call these methods over one another for easier coding. This works for me:

    /* -------------

Sound player
functions

 ------------ */

var snd:Sound;       //the sound object
var sndC:SoundChannel;     //the soudchannel used as "controller"
var sndT:SoundTransform;      //soundTransform used for volume 
var vol:Number = 1;     //the volume of the song
var pan:Number = 0;     //panning of the sound
var pos:Number = 0;     //position of the song 
var currentSound:String;       //currently playing song?


function playSound(s:String){           //this function resets the sound and plays it
    stopSound(sndC);           //stop the sound from playing
    snd = new Sound();           //reset the sound
    snd.load(new URLRequest(s));        //load the desired sound 
    sndC = new SoundChannel();         //(re-)apply the sound channel
    applyVolume(vol,pan,sndT,sndC);        //apply the volume
    sndC = snd.play(pos);          //play it
    sndC.addEventListener(Event.SOUND_COMPLETE, startSound); //remind it to restart playing when it's done
}                  //end function

function applyVolume(n:Number, p:Number, st:SoundTransform, sc:SoundChannel){   //takes an argument for the volume, pan, soundTYransform and soundChannel
    sndT = new SoundTransform(n,p);            //applies the soundTransfrom settings
    sndC.soundTransform = sndT;             //and attaches it to the soundChannel
}                      //end function

function stopSound(sndC:SoundChannel){    //this function stops a sound from playing
    if(sndC != null){       //if the sound was used before (ie: playing)
     if(currentLabel == "video-frame"){  //if we are in the video frame
       pos = sndC.position;     //store the position of the song to play from at a later time
     }else{         //otherwise
       pos = 0;        //set the position at 0
     }          //end if
     sndC.stop();       //stop it
    }           //end if
}              //end function

function startSound(snd:Sound){     //restarts a  sound when it's playing
    if(snd != null){       //if the sound exists 
     sndC = snd.play(pos);     //play it
    }           //end if
}              //end function
Moshe