fadeEffect.end(); playProgress.alpha=caption.alpha=1.0; if(e.ctrlKey){ pan=Math.min(1,pan+0.025); balance(pan); break; } if(!keyPressed){ deltaSeek=Math.max(100,snd.length/10000); if(plyng) curTime=sndCh.position; else curTime=playResumePos; } keyPressed=true; playResumePos=Math.min(snd.length-10,curTime+deltaSeek); seek(playResumePos/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.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(); pause();seek(0); } private function loadPolicy(p:String):void {policy=p;} private function play(p:Number=-1):void { if(p>=0) seek(p); if(plyng) return; try{sndCh = snd.play(playResumePos, 0, sndTr);} catch(e:Error){Alert.show(e.message,'Error');} sndCh.addEventListener(Event.SOUND_COMPLETE, onSoundComplete); plyng = true; } private function pause(p:Number=-1):void { if(p>=0){pauseAtPos=p*1000;return;} if(!plyng) return; playResumePos = sndCh.position; sndCh.stop(); plyng = false; } private function playPause():void { if(plyng) pause(); else play(); } private function seek(p:Number):void { playResumePos = p*1000; if(!plyng) return; sndCh.stop(); plyng = 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 currentTime():Number { return sndCh.position/1000; } private function playing():Boolean { return plyng; } private function duration():Number { return snd.length/1000; } private function ismuted():Boolean { return muted; } 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); ExternalInterface.addCallback("currentTime", currentTime); ExternalInterface.addCallback("duration", duration); ExternalInterface.addCallback("playing", playing); ExternalInterface.addCallback("muted", ismuted); } private function initContext():void { this.contextMenu.hideBuiltInItems(); var itemPlayPause:ContextMenuItem = new ContextMenuItem("N.N."); this.contextMenu.customItems.push(itemPlayPause); itemPlayPause.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, function(e:ContextMenuEvent):void{playPause();}); var itemRewind:ContextMenuItem = new ContextMenuItem("Rewind, [Home]"); this.contextMenu.customItems.push(itemRewind); itemRewind.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, function(e:ContextMenuEvent):void{pause();playResumePos=(0);}); var itemGotoEnd:ContextMenuItem=new ContextMenuItem("Goto End, [End]"); this.contextMenu.customItems.push(itemGotoEnd); itemGotoEnd.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, function(e:ContextMenuEvent):void{ if(playProgress.indeterminate) return; pause();playResumePos=(snd.length);}); var itemMute:ContextMenuItem = new ContextMenuItem("N.N."); this.contextMenu.customItems.push(itemMute); itemMute.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, function(e:ContextMenuEvent):void{mute();}); this.contextMenu.customItems.push( new ContextMenuItem("via keyboard:", true, false, true)); this.contextMenu.customItems.push( new ContextMenuItem("Seek, [\u2190]/[\u2192]", false, false, true)); this.contextMenu.customItems.push( new ContextMenuItem("Volume, [\u2191]/[\u2193]", false, false, true)); this.contextMenu.customItems.push( new ContextMenuItem("Balance, [Ctrl]+[\u2190]/[\u2193]/[\u2192]", false, false, true)); this.contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, function(e:ContextMenuEvent):void{ itemPlayPause.caption=(plyng ? "Pause" : "Play")+", [Space]"; itemMute.caption=(muted ? "Unmute" : "Mute")+", [m]";} ); } private function onSoundComplete(e:Event):void { plyng = false; playResumePos = 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(plyng) { playProgress.setProgress(sndCh.position,snd.length); caption.text=formatLabel(sndCh.position); } else { playProgress.setProgress(playResumePos,snd.length); caption.text=formatLabel(playResumePos); } }else{ if(plyng) { playProgress.setProgress(Math.random(),1); caption.text=formatLabel(sndCh.position); } else { playProgress.setProgress(snd.bytesLoaded,snd.bytesTotal); caption.text=formatLabel(playResumePos); } } if(plyng&&pauseAtPos>=0&&sndCh.position=0&& sndCh.position>=pauseAtPos&&toBePaused ){ pause(); pauseAtPos=-1; toBePaused=false; } } private function onID3Info(e:Event):void {id3 = e.target.id3;} private function onError(e:ErrorEvent):void { Alert.show(e.type, e.text); } ]]>