/files/audiojs/0.1/audiojs.as
ActionScript | 146 lines | 117 code | 29 blank | 0 comment | 12 complexity | 2bad4d3c39d693a8d152be4ee587f356 MD5 | raw file
- 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');
- }
- }
- }