title: Detect via ExternalInterface when swf player ready to play
body: <p>In my .fla file I include external actionscript file as indicated in the instruction file</p>
  
  <pre><code>import xxx.xxx.xxx.sound.MP3Player;
  
  var mp3Player:MP3Player = new MP3Player();
  addChild(mp3Player);
  </code></pre>
  
  <p>Now I'd like to use his loadMp3 function </p>
  
  <pre><code>/**
  * Start loading the mp3 file.
  */
  private function loadMP3():void {
  
  mp3.load(new URLRequest(MP3_URL));
  mp3.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
  channel = mp3.play();
  channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0,    true);            
  _isPlaying = true;
  }
  </code></pre>
  
  <p>to discover when the mp3 fully loaded and ready to play sound
  via ExternalInterface function.</p>
  
  <p>how could I do? thanks</p>
  
  <p>FULL CLASS</p>
  
  <pre><code>package xxx.xxx.xxx.sound {
  
  import flash.display.MovieClip;
  import flash.events.Event;
  import flash.events.IOErrorEvent;
  import flash.events.MouseEvent;
  import flash.geom.ColorTransform;
  import flash.media.Sound;
  import flash.media.SoundChannel;
  import flash.media.SoundMixer;
  import flash.net.URLRequest;
  import flash.utils.ByteArray;
  import flash.text.TextField;
  
  public class MP3Player extends MovieClip {
  
      // Location of the config xml file
      public static const CONFIG_XML_URL:String = "xml/config.xml";
  
      // URL of the mp3 file
      public static var MP3_URL:String = "mp3/track.mp3";
  
      // Main color for the mp3 player
      public static var MAIN_COLOR:uint = 0xFF0000;
  
      // An XMLLoader to load the configuration file
      private var xmlLoader:XMLLoader;
  
      // Sound object to be played
      private var mp3:Sound = new Sound();
  
      // A sound channel to play the sound object
      private var channel:SoundChannel;
  
      // Holds the pause position
      private var pausePos:Number;
  
      // A byte array to read spectrum
      private var bytes:ByteArray = new ByteArray();
  
      // Indicates whether the mp3 player is playing or not.
      private var _isPlaying:Boolean = false;
  
      // Holds the previous label color
      private var _prevColor:uint;        
  
      public function MP3Player() {
  
          // Initialize the player
          init();
  
      }
  
      /**
       * Initializes the player.
       */
      private function init():void {
  
          // Use as a button
          useHandCursor = true;
          buttonMode = true;
          mouseChildren = false;
          equalizer.alpha = 0;
  
          // Add necessary event listeners
          addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
          addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, true);
          addEventListener(MouseEvent.MOUSE_OVER, onMouseOver, false, 0, true);
          addEventListener(MouseEvent.MOUSE_OUT, onMouseOut, false, 0, true);
          loadConfig();
  
      }
  
      /**
       * Sets the color of the player to the given parameter.
       */
      public function setColor(color:uint):void {
  
          MAIN_COLOR = color;
  
          // Change the color of the equalizer
          var colorTransform:ColorTransform = equalizer.transform.colorTransform;
          colorTransform.color = MAIN_COLOR;
          equalizer.transform.colorTransform = colorTransform;
  
      }
  
  
      /**
       * Loads the configuration file to the memory.
       */
      private function loadConfig() {
  
          // Start loading the config.xml file
          xmlLoader = new XMLLoader(CONFIG_XML_URL);
          xmlLoader.addEventListener(XMLLoader.XML_LOADED, onXMLLoaded);
          xmlLoader.load();
  
      }
  
      /**
       * This method is called when the xml file is loaded to the memory.
       */
      private function onXMLLoaded(evt:Event):void {
  
          // Get configuration parameters
          var xml:XML = xmlLoader.getXML();
          MP3_URL = xml.@mp3URL;
          MAIN_COLOR = xml.@color;
  
          // Change the color of the equalizer
          equalizer.alpha = 1;
          setColor(MAIN_COLOR);
  
          // Start loading the mp3
          loadMP3();
  
      }
  
      /**
       * Start loading the mp3 file.
       */
      private function loadMP3():void {
  
          mp3.load(new URLRequest(MP3_URL));
          mp3.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
          channel = mp3.play();
          channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);            
          _isPlaying = true;
  
      }
  
      /**
       * This method is called whenever a new enter frame event occurs.
       */
      private function onEnterFrame(evt:Event):void {
  
          try {
              SoundMixer.computeSpectrum(bytes, true, 0);
          } catch (e:Error) {
          }
  
          equalizer.update(bytes);
  
      }
  
      /**
       * This method is called when playing the sound is finished.
       */
      private function onSoundComplete(evt:Event):void {
  
          // Loop
          channel = mp3.play();
          channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);
          _isPlaying = true;
  
      }
  
      /**
       * This method is called when the mouse is over the mp3 player.
       */
      private function onMouseOver(evt:MouseEvent):void {
  
          // Change the color of the equalizer
          _prevColor = label.textColor;
          label.textColor = MAIN_COLOR;
  
      }
  
      /**
       * This method is called when the mouse leaves the mp3 player.
       */
      private function onMouseOut(evt:MouseEvent):void {
  
          label.textColor = _prevColor;
  
      }
  
      /**
       * This method is called when the mouse is clicked on the mp3 player.
       */
      private function onMouseDown(evt:MouseEvent):void {
  
          if (_isPlaying) {
              pausePos = channel.position;
              channel.stop();
              _isPlaying = false;
              label.text = "MUSIC OFF";               
          } else {
              channel = mp3.play(pausePos);
              channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);
              _isPlaying = true;
              label.text = "MUSIC ON";
          }
  
      }
  
      /**
       * This method is called if an IO error occurs.
       */
      private function onIOError(evt:IOErrorEvent):void {
      }
  
  }
  </code></pre>
  
  <p>}</p>