/*
* Xorax AS2 Player - Action Script 2 flash class for designer
*
* Copyright (c) 2008 Martin Panel (contact@xorax.info)
* licensed under the MIT (MIT-LICENSE.txt)
*/
/**
* @see flash mp3 player as2
* @author Xorax
* @license http://www.opensource.org/licenses/mit-license.php copyright Martin PANEL : MIT license
* @version 20080523
* @description fournit les fonctions nécéssaires à la lecture de fichier audio.
*/
class xorax.player.base {
private var playing;
private var loading:Number;
private var _src;
private var sound:Sound;
private var volume;
private var responders;
private var pausedAt:Number;
/**
* source du son (fichier mp3, flux...)
*/
public var src:String;
/**
* Le son doit-il être traité comme un flux. si oui la lecture démarre dés que possible. (par défaut : true)
*/
public var streaming:Boolean;
/**
* cran d'incrémentation du volume (par default: 10)
*/
public var volumeStage:Number;
/**
* si = true, alors le constructor cherchera les variables passées en paramètre à l'animation (_root.*)
*/
public static var auto:Boolean = true;
/**
* constructeur de la classe
* @param auto autoconfigure le lecteur en fonction de flashvars (variables disponibles sur _root)
* il existe 3 variables de configuration :
* - callable : exporte certaines fonctions pour qu'elle soit disponible en javascript dans la page html
* - src : url de la source audio. permet de préconfigurer le son (mp3, stream ou autre) à jouer.
* - auto : démarre automatiquement la lecture lorsque l'animation est chargé.
* exemple :
* _root.src = 'son.mp3';
* var myPlayer = new xorax.player.base(true);
* //myPlayer a préenregistré la valeur _root.src en tant que source audio.
* myPlayer.play(); // va démarrer la lecture de 'son.mp3'
*/
function base (){
//this.config = {};
this.playing = -1;
this.loading = -1;
this.pausedAt = -1;
//this.src = undefined;
this.sound = new Sound();
this.sound.setVolume(100);
this.volume = this.sound.getVolume();
this.streaming = true;
this.responders = {};
AsBroadcaster.initialize(this.responders);
this.volumeStage = 10; //int interval for up/down volume
var th = this;
this.sound.onSoundComplete = function(){th.onComplete();};
this.sound.onLoad = function(succ){th.onLoading(succ);};
if(xorax.player.base.auto){
if(_root.callable !== false) this.initExternalMethod();
if(_root.src) this.src = _root.src;
if(this.src && _root.autoplay) this.play();
}
}
function addListener (obj){
this.responders.addListener(obj);
}
function removeListener (obj){
this.responders.removeListener(obj);
}
function onLoading (success){
/*if(this.playing === false){
this.sound.start(0);
this.playing = setInterval(this,"onPlaying",200);
}*/
if(success && this.isOnLoading()){
this.sound.onLoad = null;
clearInterval(this.loading);
this.loading = -1;
}
this.responders.broadcastMessage('onLoading',success);
}
function onPlaying (){
this.responders.broadcastMessage('onPlaying');
}
function onComplete (){
this.stopPlaying();
this.pausedAt = -1;
}
/**
* Permet de connaitre la durée du son en millisecond. Si le chargement du son est en cour, la durée est approximative.
* @return int la durée du son chargé en millisecond
*/
public function duration ():Number {
if(this.isOnLoading()){
if(!this.sound.duration){
return this.position() * this.sound.getBytesTotal() / this.sound.getBytesLoaded();
} else {
return this.sound.duration * this.sound.getBytesTotal() / this.sound.getBytesLoaded();
}
} else return this.sound.duration;
}
/**
* Si msec est défni, la tête de lecture se déplacera à msec milliseconde (ou plutôt à msec/1000 seconde) et commencera la lecture.
* Sinon, renovi la postion de la tête de lecture en milliseconde.
* @param msec en milliseconde (arrondie plus tard à la second). (optionnel)
*/
function position (msec:Number):Number {
if(msec == null) return (this.sound.position) || 0;
if(this.isOnLoading() && this.sound.duration - _root._soundbuftime*1000 < msec ){
this.sound.start(this.sound.duration/1000 - _root._soundbuftime);
} else this.sound.start(msec/1000);
this.startPlaying();
return this.position();
}
function startPlaying ():Void {
if(!this.isOnPlaying()){
this.responders.broadcastMessage('onStart');
this.playing = setInterval(this,"onPlaying",50);
this.volumeSet(this.volume);
}
}
function stopPlaying ():Void {
if(this.isOnPlaying()){
clearInterval(this.playing);
this.playing = -1;
}
}
/**
* renvoi si oui ou non le son est en cour de lecture.
*/
public function isOnPlaying ():Boolean {
return (this.playing !== -1);
}
/**
* renvoi si oui ou non le son est en cour de chargement
*/
public function isOnLoading():Boolean {
return (this.loading !== -1);
}
/**
* renvoi si oui ou non le son est en pause
*/
public function isOnPause():Boolean {
return (this.pausedAt !== -1);
}
/**
* renvoi le nombre de Bytes télécharger pour le son en cour
*/
public function getBytesLoaded():Number {
return this.sound.getBytesLoaded() || 0;
}
/**
* renvoi la taille en Bytes du son en cour
*/
public function getBytesTotal():Number {
return this.sound.getBytesTotal() || 0;
}
/**
* joue le son, redémarre un son qui était en pause
* @param src nouvelle source du son (optionnel)
*/
public function play (src:String):Void{
if(src) this.src = src;
if( this.src != this._src){
this.stop();
this._src = this.src;
this.loading = setInterval(this,"onLoading", 100, false);
var th = this;
this.sound.onLoad = function(s){th.onLoading(s);};
this.sound.loadSound(this._src,this.streaming);
if(this.streaming) this.startPlaying();
} else{
if(this.isOnPause()){ // && this.playing
this.sound.start(this.pausedAt);
this.pausedAt = -1;
} else {
this.sound.start(0);
}
this.startPlaying();
}
}
/**
* met le son en pause
*/
public function pause ():Void{
this.stopPlaying();
if(!this.isOnPause()) this.pausedAt = Math.round((this.sound.position || 0)/1000);
this.sound.stop();
}
/**
* arrète la lecture (le son reprendra au début)
*/
public function stop ():Void{
this.sound.start(0);
this.sound.stop();
//on attend une dernière exécution afin que les bar de position se remette à 0
this.onPlaying();
var tp = setInterval(function(){
this.stopPlaying();
clearInterval(tp);
},50);
this.pausedAt = -1;
}
/**
* défini le volume audio
* @param v volume du son / 100
*/
public function volumeSet(v:Number):Number{
v = Math.round(Math.max(0,Math.min(100,v)));
this.volume = v;
this.responders.broadcastMessage('onVolumeChange');
if(this.isOnPlaying()) this.sound.setVolume(v);
return v;
}
/**
* renvoi le volume du son / 100
*/
public function volumeGet():Number {
return this.volume;
}
/**
* incrémente le volume de volumeStage point (par défaut 10/100)
*/
public function volumeInc ():Number{
return this.volumeSet(this.volumeGet() + this.volumeStage);
}
/**
* décrémente le voolume de volumeStage poin (par défaut 10/100)t
*/
public function volumeDec ():Number {
return this.volumeSet(this.volumeGet() - this.volumeStage);
}
/**
* déplace la tête de lecture à la position pos.
* méthode utilisé pour les appels javascript
* @param pos rapport de position de la tête de lecture (0 à 1)
*/
public function positionSet (pos):Void { // 0 à 1
if(pos < 0) pos = 0;
if(pos > 100) pos = 100;
this.sound.start(this.duration() * pos / 100 );
this.startPlaying();
}
/**
* méthode utilisé pour les appels javascript.
* @return numbre entre 0 et 1 : position de la tête de lecture par rapport à la durée du son
*/
public function positionGet ():Number { // 0 à 1
var d = this.duration();
return (d) ? this.position()/d : 0;
}
/**
* initialize les fonctions javascript qui seront disponible dans l'object flash de la page web.
* les fonctions suivante de cette class seront exportées :
* play, pause, stop, volumeDec, volumeInc, volumeSet, volumeGet, positionSet, positionGet, isOnPlaying, isOnLoading, isOnPause
*/
public function initExternalMethod(){
if(!flash.external.ExternalInterface.available) return trace("External Interface not available");
var m = ['play','pause','stop','volumeDec','volumeInc','volumeSet','volumeGet','positionSet','positionGet','isOnPlaying','isOnLoading','isOnPause'];
for(var i=0; i < m.length; i++){
var su = flash.external.ExternalInterface.addCallback('xorax_player_'+m[i], this, this[m[i]]);
}
}
}