diff options
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.mxml | 345 |
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> |