summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/media9/files/players/APlayer9.mxml
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/latex/media9/files/players/APlayer9.mxml')
-rw-r--r--Master/texmf-dist/doc/latex/media9/files/players/APlayer9.mxml345
1 files changed, 345 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/media9/files/players/APlayer9.mxml b/Master/texmf-dist/doc/latex/media9/files/players/APlayer9.mxml
new file mode 100644
index 00000000000..7559b779679
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/media9/files/players/APlayer9.mxml
@@ -0,0 +1,345 @@
+<?xml version="1.0"?>
+<!-- -->
+<!-- Adobe Flex 3 source file of APlayer9.swf, -->
+<!-- a FlashPlayer-9 compatible component for playing -->
+<!-- MP3 audio files and streams. -->
+<!-- -->
+<!-- version 20131030 -->
+<!-- -->
+<!-- Copyright (C) 2012-today Alexander Grahn -->
+<!-- -->
+<!-- This work may be distributed and/or modified under the -->
+<!-- conditions of the LaTeX Project Public License, either -->
+<!-- version 1.3 of this license or (at your option) any later -->
+<!-- version. -->
+<!-- -->
+<!-- The latest version of this license is in -->
+<!-- http://www.latex-project.org/lppl.txt -->
+<!-- and version 1.3 or later is part of all distributions of -->
+<!-- LaTeX version 2005/12/01 or later. -->
+<!-- -->
+<!-- This work has the LPPL maintenance status `maintained'. -->
+<!-- -->
+<!-- The current maintainer of this work is A. Grahn. -->
+<!-- -->
+
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
+ preinitialize="initialise(Application.application.parameters);"
+ applicationComplete="initSound();addEventListeners();"
+ creationComplete="initCallBacks();"
+ mouseDown="pause();setFocus();"
+ mouseUp="play();"
+ backgroundAlpha="0"
+ paddingTop="0" paddingBottom="0"
+ paddingLeft="0" paddingRight="0"
+ layout="absolute" clipContent="false"
+>
+
+ <mx:Script>
+ <![CDATA[
+ [Bindable] private var source:String;
+ [Bindable] private var policy:String=null;
+ [Bindable] private var autoPlay:Boolean=false;
+ [Bindable] private var loop:Boolean=false;
+ [Bindable] private var vol:Number=0.75;
+ [Bindable] private var pan:Number=0;
+ [Bindable] private var hideBar:Boolean=false;
+ [Bindable] private var txtAlign:String;
+
+ private var snd:Sound;
+ private var id3:ID3Info;
+ private var sndCh:SoundChannel;
+ private var sndTr:SoundTransform;
+ private var playResumePosition:Number = 0;
+ private var playing:Boolean = false;
+ private var muted:Boolean = false;
+ private var lastVol:Number;
+
+ private var deltaSeek:Number;
+ private var currentTime:Number;
+ private var keyPressed:Boolean=false;
+ private var mouseIsOver:Boolean=false;
+
+ import flash.external.*;
+ private function initialise(flashVars:Object):void {
+ source=flashVars.source;
+ if(flashVars.policy) policy=flashVars.policy;
+ if(flashVars.autoPlay=='true') autoPlay=true;
+ if(flashVars.loop=='true') loop=true;
+ if(flashVars.volume) vol=Number(flashVars.volume);
+ if(flashVars.balance) pan=Number(flashVars.balance);
+ if(flashVars.hideBar=='true') hideBar=true;
+ }
+
+ import mx.controls.Alert;
+
+ private function initSound():void {
+ snd = new Sound(); id3=null;
+ sndTr = new SoundTransform(vol, pan);
+ snd.addEventListener(Event.ID3, onID3Info);
+ snd.addEventListener(IOErrorEvent.IO_ERROR, onError);
+ snd.addEventListener(ProgressEvent.PROGRESS, onProgress);
+ snd.addEventListener(Event.COMPLETE, onComplete);
+ if(policy) Security.loadPolicyFile(policy);
+ snd.load(new URLRequest(source), new SoundLoaderContext(1000, true));
+ if(autoPlay) play();
+ }
+
+ private function onMouseOver(e:MouseEvent):void {
+ mouseIsOver=true;
+ fadeEffect.end();
+ playProgress.alpha=caption.alpha=1.0;
+ caption.visible=!hideBar;
+ }
+
+ private function onMouseOut(e:MouseEvent):void {
+ mouseIsOver=false;
+ fadeEffect.play();
+ }
+
+ private function onKeyDown(e:KeyboardEvent):void {
+ switch(e.keyCode) {
+ case 32: //space bar
+ playPause();
+ break;
+ case 36: //home
+ pause();
+ playResumePosition=(0);
+ break;
+ case 35: //end
+ if(playProgress.indeterminate) break;
+ pause();
+ playResumePosition=(snd.length);
+ break;
+ case 37: //<--
+ fadeEffect.end();
+ playProgress.alpha=caption.alpha=1.0;
+ caption.visible=!hideBar;
+ if(e.ctrlKey){
+ pan=Math.max(-1,pan-0.025);
+ balance(pan);
+ break;
+ }
+ if(!keyPressed){
+ deltaSeek=Math.max(100,snd.length/10000);
+ if(playing)
+ currentTime=sndCh.position;
+ else
+ currentTime=playResumePosition;
+ }
+ keyPressed=true;
+ playResumePosition=Math.max(0,currentTime-deltaSeek);
+ if(playing) seek(playResumePosition/1000);
+ deltaSeek*=1.1;
+ break;
+ case 39: //-->
+ fadeEffect.end();
+ playProgress.alpha=caption.alpha=1.0;
+ caption.visible=!hideBar;
+ if(e.ctrlKey){
+ pan=Math.min(1,pan+0.025);
+ balance(pan);
+ break;
+ }
+ if(!keyPressed){
+ deltaSeek=Math.max(100,snd.length/10000);
+ if(playing)
+ currentTime=sndCh.position;
+ else
+ currentTime=playResumePosition;
+ }
+ keyPressed=true;
+ playResumePosition=Math.min(snd.length-10,currentTime+deltaSeek);
+ seek(playResumePosition/1000);
+ deltaSeek*=1.1;
+ break;
+ case 38:
+ vol=Math.min(1,vol+0.025);
+ volume(vol);
+ break;
+ case 40:
+ if(e.ctrlKey){
+ pan=0;
+ balance(pan);
+ break;
+ }
+ vol=Math.max(0,vol-0.025);
+ volume(vol);
+ break;
+ default:
+ if(e.charCode==109) mute(); //`m'
+ }
+ }
+
+ private function onKeyUp(e:KeyboardEvent):void {
+ switch(e.keyCode) {
+ case 37: //<--
+ case 39: //-->
+ deltaSeek=Math.max(100,snd.length/10000);
+ keyPressed=false;
+ if (!mouseIsOver) fadeEffect.play();
+ break;
+ }
+ }
+
+ private function formatLabel(s:Number):String {
+ s/=1000;
+ var hrs:Number = Math.floor(s / 3600);
+ var min:Number = Math.floor(s / 60 % 60);
+ var sec:Number = Math.floor(s % 60);
+ var fmtd:String='';
+ if(hrs>0) fmtd = String(hrs)+':';
+ if(hrs>0 && min <10) fmtd+='0';
+ fmtd += String(min)+':';
+ if(sec<10) fmtd+='0';
+ fmtd += String(sec);
+ txtAlign="center";
+ try{
+ if(id3.songName)
+ fmtd += ' '+ String.fromCharCode(0x2014) + ' ' + id3.songName;
+ if(id3.artist) fmtd += ' | ' + id3.artist;
+ if(id3.album) fmtd += ' | ' + id3.album;
+ if(id3) txtAlign="start";
+ }catch(e:Object){}
+ return fmtd;
+ }
+
+ private function addEventListeners():void {
+ this.setFocus();
+ this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
+ this.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
+ this.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
+ this.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
+ this.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
+ }
+
+ private function setSource(s:String):void {
+ pause();
+ source=s;
+ initSound();
+ }
+
+ private function loadPolicy(p:String):void {policy=p;}
+
+ private function play():void {
+ if(playing) return;
+ try{sndCh = snd.play(playResumePosition, 0, sndTr);}
+ catch(e:Error){Alert.show(e.message,'Error');}
+ sndCh.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
+ playing = true;
+ }
+
+ private function pause():void {
+ if(!playing) return;
+ playResumePosition = sndCh.position;
+ sndCh.stop();
+ playing = false;
+ }
+
+ private function playPause():void {
+ if(playing) pause(); else play();
+ }
+
+ private function seek(p:Number):void {
+ playResumePosition = p*1000;
+ if(!playing) return;
+ sndCh.stop();
+ playing = false;
+ play();
+ }
+
+ private function rewind():void {
+ seek(0);
+ }
+
+ private function volume(v:Number):void {
+ sndTr.volume = v;
+ sndCh.soundTransform=sndTr;
+ }
+
+ private function mute():void {
+ if(muted) {
+ if(lastVol==0) lastVol=0.75;
+ volume(lastVol);
+ muted=false;
+ }
+ else {
+ lastVol = sndTr.volume
+ volume(0);
+ muted=true;
+ }
+ }
+
+ private function balance(p:Number):void {
+ sndTr.pan = p;
+ sndCh.soundTransform=sndTr;
+ }
+
+ private function initCallBacks():void {
+ ExternalInterface.addCallback("play", play);
+ ExternalInterface.addCallback("pause", pause);
+ ExternalInterface.addCallback("playPause", playPause);
+ ExternalInterface.addCallback("seek", seek);
+ ExternalInterface.addCallback("rewind", rewind);
+ ExternalInterface.addCallback("volume", volume);
+ ExternalInterface.addCallback("balance", balance);
+ ExternalInterface.addCallback("mute", mute);
+ ExternalInterface.addCallback("setSource", setSource);
+ ExternalInterface.addCallback("loadPolicy", loadPolicy);
+ }
+
+ private function onSoundComplete(e:Event):void {
+ playing = false;
+ playResumePosition = 0;
+ if(loop) play();
+ }
+
+ private function onComplete(e:Event):void {
+ playProgress.indeterminate=false;
+ }
+
+ private function onProgress(e:ProgressEvent):void {
+ playProgress.indeterminate=true;
+ }
+
+ private function onEnterFrame(e:Event):void {
+ if(!playProgress.indeterminate) {
+ if(playing) {
+ playProgress.setProgress(sndCh.position,snd.length);
+ caption.text=formatLabel(sndCh.position);
+ } else {
+ playProgress.setProgress(playResumePosition,snd.length);
+ caption.text=formatLabel(playResumePosition);
+ }
+ }else{
+ if(playing) {
+ playProgress.setProgress(Math.random(),1);
+ caption.text=formatLabel(sndCh.position);
+ } else {
+ playProgress.setProgress(snd.bytesLoaded,snd.bytesTotal);
+ caption.text=formatLabel(playResumePosition);
+ }
+ }
+ }
+
+ private function onID3Info(e:Event):void {id3 = e.target.id3;}
+
+ private function onError(e:ErrorEvent):void {
+ Alert.show(e.type, e.text);
+ }
+ ]]>
+ </mx:Script>
+
+ <mx:Fade id="fadeEffect" target="{playProgress}" alphaFrom="1.0" alphaTo="0"
+ effectEnd="caption.visible=false" duration="2000"/>
+
+ <mx:ProgressBar width="100%" height="100%" mode="manual"
+ labelPlacement="center" label="" id="playProgress"
+ visible="{!hideBar}"
+ />
+
+ <mx:Label id="caption" width="100%" verticalCenter="0"
+ paddingTop="2" fontWeight="bold" visible="{!hideBar}"
+ textAlign="{txtAlign}" paddingLeft="5"
+ />
+</mx:Application>