AS3: MP3 Player
Usage:
var player:Mp3Player = new Mp3Player();
player.play('blah.mp3');
or
var player:Mp3Player = new Mp3Player();
player.playlist = ['item1.mp3','item2.mp3'];
player.next();
// From http://unformatt.com/news/as3-mp3-player/
package {
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import flash.net.URLRequest;
import flash.utils.clearInterval;
import flash.utils.setInterval;
public class Mp3Player extends EventDispatcher {
static public const EVENT_TIME_CHANGE:String = 'Mp3Player.TimeChange';
static public const EVENT_VOLUME_CHANGE:String = 'Mp3Player.VolumeChange';
static public const EVENT_PAN_CHANGE:String = 'Mp3Player.PanningChange';
static public const EVENT_PAUSE:String = 'Mp3Player.Pause';
static public const EVENT_UNPAUSE:String = 'Mp3Player.Unpause';
static public const EVENT_PLAY:String = 'Mp3Player.Play';
//
public var playing:Boolean;
public var playlist:Array;
public var currentUrl:String;
public var playlistIndex:int = -1;
//
protected var sound:Sound;
protected var soundChannel:SoundChannel;
protected var soundTrans:SoundTransform;
protected var progressInt:Number;
public function play( url:String ):void {
clearInterval(progressInt);
if ( sound ) {
soundChannel.stop();
try {sound.close();}catch(error:Error){trace(error);}
}
currentUrl = url;
sound = new Sound();
sound.addEventListener(Event.SOUND_COMPLETE, onLoadSong);
sound.addEventListener(Event.ID3, onId3Info);
sound.load(new URLRequest(currentUrl));
soundChannel = sound.play();
if ( soundTrans ) {
soundChannel.soundTransform = soundTrans;
} else {
soundTrans = soundChannel.soundTransform;
}
soundChannel.addEventListener(Event.COMPLETE, onSongEnd);
playing = true;
clearInterval(progressInt);
progressInt = setInterval(updateProgress, 30);
dispatchEvent(new Event(EVENT_PLAY));
}
public function pause():void {
if ( soundChannel ) {
soundChannel.stop();
dispatchEvent(new Event(EVENT_PAUSE));
playing = false;
}
}
public function unpause():void {
if ( playing ) return;
if ( soundChannel.position < sound.length ) {
soundChannel = sound.play(soundChannel.position);
soundChannel.soundTransform = soundTrans;
} else {
soundChannel = sound.play();
}
dispatchEvent(new Event(EVENT_UNPAUSE));
playing = true;
}
public function seek( percent:Number ):void {
soundChannel.stop();
soundChannel = sound.play(sound.length * percent);
}
public function prev():void {
playlistIndex--;
if ( playlistIndex < 0 ) playlistIndex = playlist.length - 1;
play(playlist[playlistIndex]);
}
public function next():void {
playlistIndex++;
if ( playlistIndex == playlist.length ) playlistIndex = 0;
play(playlist[playlistIndex]);
}
public function get volume():Number {
if (!soundTrans) return 0;
return soundTrans.volume;
}
public function set volume( n:Number ):void {
if ( !soundTrans ) return;
soundTrans.volume = n;
soundChannel.soundTransform = soundTrans;
dispatchEvent(new Event(EVENT_VOLUME_CHANGE));
}
public function get pan():Number {
if (!soundTrans) return 0;
return soundTrans.pan;
}
public function set pan( n:Number ):void {
if ( !soundTrans ) return;
soundTrans.pan = n;
soundChannel.soundTransform = soundTrans;
dispatchEvent(new Event(EVENT_PAN_CHANGE));
}
public function get length():Number {
return sound.length;
}
public function get time():Number {
return soundChannel.position;
}
public function get timePretty():String {
var secs:Number = soundChannel.position / 1000;
var mins:Number = Math.floor(secs / 60);
secs = Math.floor(secs % 60);
return mins + ":" + (secs < 10 ? "0" : "") + secs;
}
public function get timePercent():Number {
if ( !sound.length ) return 0;
return soundChannel.position / sound.length;
}
protected function onLoadSong( e:Event ):void {
}
protected function onSongEnd( e:Event ):void {
if ( playlist )
next();
}
protected function onId3Info( e:Event ):void {
dispatchEvent(new Event(Event.ID3, e.target.id3));
}
protected function updateProgress():void {
dispatchEvent(new Event(EVENT_TIME_CHANGE));
if ( timePercent >= .99 ) {
onSongEnd(new Event(Event.COMPLETE));
clearInterval(progressInt);
}
}
}
}

7 Comments
Jump to comment form | comments rss [?] | trackback uri [?]