Recipe 15.8. Find Out When a Sound Finishes Playing


Problem

You've started playing a sound file and need to know when it has finished playing.

Solution

Listen for the soundComplete event.

Discussion

There are many cases when you might need to know when a sound is finished playing. For example, if have an audio introduction that you want to play before a user moves onto the next section of a site, you will want to know when it is safe to go to the next section. Or perhaps you have a music player with a playlist of songs. You'll want to know when each song is complete so you can start the next one.

For this recipe, and the next few, you'll be working with another class in the flash.media package, SoundChannel. When you call a Sound object's play( ) method, it returns a SoundChannel object. Thus, each sound playing in a .swf is represented by a single SoundChannel object. These channels are mixed together to produce the final audio output.

When a sound file has finished playing, its corresponding SoundChannel object fires a soundComplete event. This is defined as flash.events.Event.SOUND_COMPLETE. You can add a listener to the SoundChannel object and supply a handler method, which is called when the sound has finished playing.

The following example sets up a simple playlist:

package {     import flash.display.Sprite;     import flash.media.Sound;     import flash.net.URLRequest;     import flash.events.Event;     import flash.media.SoundChannel;          public class PlayList extends Sprite {         private var _sound:Sound;         private var _channel:SoundChannel;         private var _playList:Array;      // the list of songs         private var _index:int = 0;       // the current song         public function PlayList(  ) {             // Create the playlist and start playing             _playList = ["song1.mp3",                          "song2.mp3",                         "song3.mp3"];             playNextSong(  );         }                  private function playNextSong(  ):void         {             // If there are still songs in the playlist             if(_index < _playList.length) {                 // Create a new Sound object, load and play it                 // _playList[_index] contains the name and path of                 // the next song                 _sound = new Sound(  );                 _sound.load(new URLRequest(_playList[_index]));                 _channel = _sound.play(  );                 // Add the listener to the channel                 _channel.addEventListener(Event.SOUND_COMPLETE,                                          onComplete);                 // Increase the counter                 _index++;             }         }                  public function onComplete(event:Event):void         {             playNextSong(  );         }     }     }

Here, the index variable starts out as zero. This causes _playList[index] to be evaluated as "song.mp3", which gets loaded first. Then index is incremented. When the soundComplete event fires, the playNextSong( ) method loads the next song in _playList, until the index is greater than the number of songs in the playlist.

See Also

Recipe 15.1 for information on how to load external sound files.




ActionScript 3. 0 Cookbook
ActionScript 3.0 Cookbook: Solutions for Flash Platform and Flex Application Developers
ISBN: 0596526954
EAN: 2147483647
Year: 2007
Pages: 351

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net