package { import flash.display.Sprite; import flash.external.ExternalInterface; import flash.net.URLRequest; import flash.media.Sound; import flash.media.SoundChannel; import flash.media.SoundTransform; import flash.events.Event; import flash.errors.IOError; import flash.events.IOErrorEvent; import flash.events.ProgressEvent; import flash.events.TimerEvent; import flash.utils.Timer; import flash.system.Security; public class audiojs extends Sprite { private var _channel:SoundChannel; private var sound:Sound; private var duration:Number; private var playerInstance:String; private var pausePoint:Number = 0; private var playing:Boolean = false; private var volume:Number = 1; private var timer:Timer = new Timer(250, 0); private function get channel():SoundChannel { return this._channel; } private function set channel(channel:SoundChannel):void { this._channel = channel; this._channel.addEventListener(Event.SOUND_COMPLETE, this.soundEnded); } public function audiojs():void { Security.allowDomain("*"); this.playerInstance = root.loaderInfo.parameters.playerInstance+'.'; ExternalInterface.addCallback('init', init); ExternalInterface.addCallback('load', load); ExternalInterface.addCallback('playPause', playPause); ExternalInterface.addCallback('pplay', play); ExternalInterface.addCallback('ppause', pause); ExternalInterface.addCallback('skipTo', skipTo); ExternalInterface.addCallback('setVolume', setVolume); ExternalInterface.call(this.playerInstance+'loadStarted'); } private function updatePlayhead(e:TimerEvent = null):void { var targetPosition:Number = e ? this.channel.position : this.pausePoint; var playProgress:Number = targetPosition / this.duration; if (playProgress > 1) playProgress = 1; if (playProgress > 0) { ExternalInterface.call(this.playerInstance+'updatePlayhead', playProgress); } } private function loadProgress(e:ProgressEvent):void { this.duration = (e.bytesTotal / (e.bytesLoaded / this.sound.length)) var loadPercent:Number = e.bytesLoaded / e.bytesTotal; if (loadPercent > 1) loadPercent = 1; if (loadPercent > 0) { ExternalInterface.call(this.playerInstance+'loadProgress', loadPercent, (this.duration/1000)); } } private function init(mp3:String):void { this.load(mp3); } private function load(mp3:String):void { if (this.channel) this.channel.stop(); if (this.sound) this.sound.removeEventListener(ProgressEvent.PROGRESS, this.loadProgress); this.channel = new SoundChannel(); this.sound = new Sound(new URLRequest(mp3)); this.pausePoint = 0; this.sound.addEventListener(IOErrorEvent.IO_ERROR, this.loadError); this.sound.addEventListener(ProgressEvent.PROGRESS, this.loadProgress); this.timer.addEventListener(TimerEvent.TIMER, this.updatePlayhead); this.timer.start(); } private function loadError(e:IOErrorEvent):void { ExternalInterface.call(this.playerInstance+'loadError'); } private function play():void { this.channel = this.sound.play(this.pausePoint); this.setVolume(this.volume); this.playing = true; this.timer.start(); } private function pause():void { this.pausePoint = this.channel.position; this.channel.stop(); this.playing = false; this.timer.stop(); } private function playPause():void { if (this.playing) { this.pause(); } else { this.play(); } } private function skipTo(percent:Number):void { this.channel.stop(); this.pausePoint = this.duration * percent; if (this.playing) { this.channel = this.sound.play(this.pausePoint); this.setVolume(this.volume); } else { this.updatePlayhead(); } } private function setVolume(vol:Number):void { this.volume = vol; var transform:SoundTransform = this.channel.soundTransform; if (vol < 0) vol = 0; if (vol > 1) vol = 1; transform.volume = vol; channel.soundTransform = transform; } private function soundEnded(e:Event):void { ExternalInterface.call(this.playerInstance+'trackEnded'); } } }