<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:controls="com.cynergysystems.controls.*" 
    frameRate="75"
    layout="absolute" 
    creationComplete="onCreationComplete()" 
    horizontalScrollPolicy="off" 
    verticalScrollPolicy="off"  viewSourceURL="srcview/index.html">
    
    <mx:Style source="styles.css" />
    
    <mx:Script>
        <![CDATA[
            import mx.effects.easing.Bounce;
            
            [Bindable]
            private var sound : Sound;
            private var soundChannel : SoundChannel;
            private var file : URLRequest;
            
            [Bindable]
            private var playing : Boolean = false;
            [Bindable]
            private var loading : Boolean = false;
                
            [Bindable]
            private var lColor:uint = 0x660000;
            [Bindable]
            private var rColor:uint = 0x000066;
            [Bindable]
            private var freqBars:uint = 25;
            
            private static const initialAlpha : Number = .3;
            private static const finalAlpha : Number = 1;
            
            [Bindable]
            private var fileArray : Array = [
                 { label:"1000 Hz Sine Wave", url:"http://www.cynergysystems.com/blogs/blogs/andrew.trice/visualization/assets/audio/Sin1000Hz.mp3" },
                 { label:"85 Hz Sine Wave", url:"http://www.cynergysystems.com/blogs/blogs/andrew.trice/visualization/assets/audio/85Hz_sinewave.mp3" },
                 { label:"Pink Noise", url:"http://www.cynergysystems.com/blogs/blogs/andrew.trice/visualization/assets/audio/g_pink.mp3" },
                 { label:"Frequency Sweep", url:"http://www.cynergysystems.com/blogs/blogs/andrew.trice/visualization/assets/audio/g_sweep1.mp3" },
                 { label:"Music", url:"http://www.cynergysystems.com/blogs/blogs/andrew.trice/visualization/assets/audio/03-Last Train Home.mp3" }
                ];
            
            private function onCreationComplete() : void
            {
                addEventListener( Event.ENTER_FRAME, onEnterFrame );
            }
            
            private function onSoundOpen( event : Event ) : void
            {
                progress.label = "opening media...";
            }
            
            private function onSoundProgress( event : ProgressEvent ) : void
            {
                progress.label = "loading: " + event.bytesLoaded.toString() + "/" + event.bytesTotal.toString();
                progress.setProgress( event.bytesLoaded, event.bytesTotal);
            }
            
            private function onEnterFrame( event : Event ) : void
            {
                if ( soundChannel != null && playing )
                {
                    if ( playing )
                        progress.setProgress( soundChannel.position, sound.length );
                }
            }
            
            private function play() : void
            {
                if(playing) 
                    soundChannel.stop();
                playing = false;
                
                if ( dg.selectedItem == null ) return;
                
                if ( sound != null ) 
                {
                    sound.removeEventListener( Event.COMPLETE, onSoundComplete );
                    sound.removeEventListener( Event.OPEN, onSoundOpen );
                    sound.removeEventListener( ProgressEvent.PROGRESS, onSoundProgress );
                }
                
                if(soundChannel != null)
                    soundChannel.removeEventListener(Event.SOUND_COMPLETE, onSoundPlayComplete );
                
                sound = new Sound();
                file = new URLRequest( dg.selectedItem.url );
                sound.load( file );
                loading = true;
                
                sound.addEventListener( Event.COMPLETE, onSoundComplete );
                sound.addEventListener( Event.OPEN, onSoundOpen );
                sound.addEventListener( ProgressEvent.PROGRESS, onSoundProgress );
                sound.addEventListener( ProgressEvent.PROGRESS, onSoundProgress );
            }
            
            private function onSoundComplete( event : Event ) : void
            {
                loading = false;
                progress.label = "playing";
                progress.setProgress( 0, sound.length );
                soundChannel = sound.play( 0 );
                soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundPlayComplete );
                playing = true;
            }
            
            private function onSoundPlayComplete( event : Event ) : void
            {
                playing = false;
                progress.label = "stopped";
                progress.setProgress( 0, sound.length );
            }
            
            private function stop() : void
            {
                soundChannel.stop();
                playing = false;
            }
            
        ]]>
    </mx:Script>
    
    <mx:SWFLoader source="@Embed('assets/logo.swf')"  horizontalCenter="0" verticalCenter="0" width="602" height="540"/>
    
    <mx:Panel 
        alpha="{ initialAlpha }"
        creationCompleteEffect="{ creationCompleteEffect }"
        layout="absolute"
        visible="true"
        title="Peak Visualization"
        height="352" width="136" horizontalCenter="-242" verticalCenter="4">
        
        <controls:PeakVisualization 
            top="10" bottom="10" left="10" right="10" 
            lColor="{ lColor }" rColor="{ rColor }" />
        
    </mx:Panel>
    
    <mx:Panel 
        alpha="{ initialAlpha }"
        creationCompleteEffect="{ creationCompleteEffect }"
        layout="absolute"
        visible="true"
        title="Waveform Visualization"
         height="164" width="269" horizontalCenter="-31.5" verticalCenter="-90">
         
        <controls:WaveformVisualization 
            top="10" bottom="10" left="10" right="10" 
            lColor="{ lColor }" rColor="{ rColor }" />
        
    </mx:Panel>
    
    <mx:Panel 
        alpha="{ initialAlpha }"
        creationCompleteEffect="{ creationCompleteEffect }"
        layout="absolute"
        visible="true"
        title="Frequency Visualization"
        height="164" width="200" horizontalCenter="211" verticalCenter="-90">
        
        <controls:FrequencyVisualization id="fv" 
            top="10" bottom="10" left="10" right="10" 
            lColor="{ lColor }" rColor="{ rColor }" bars="{ freqBars }" />
        
    </mx:Panel>
    
    <mx:Panel 
        alpha="{ initialAlpha }"
        creationCompleteEffect="{ creationCompleteEffect }"
        layout="absolute"
        visible="true" 
        id="player"  
        title="Options"
        height="180" width="477" horizontalCenter="72.5" verticalCenter="90">
        
        <mx:DataGrid top="10" bottom="10" left="10" right="215" dataProvider="{ fileArray }" id="dg" >
            <mx:columns>
                <mx:DataGridColumn headerText="Sound Type" dataField="label"/>
            </mx:columns>
        </mx:DataGrid>
        
        <mx:Button label="Play Selected File" click="play()" id="playButton"  width="124" left="250" top="10" height="22" enabled="{ !loading }" />
        
        <mx:ProgressBar 
            id="progress" mode="manual"   
            left="250" right="10" top="102"  label="select a file on the left"/>
        
        <mx:ColorPicker bottom="85" right="161" id="leftColor" selectedColor="{lColor}" change="lColor=leftColor.selectedColor" />
        <mx:ColorPicker bottom="85" right="83" id="rightColor" selectedColor="{rColor}" change="rColor=rightColor.selectedColor" />
        
        <mx:Label text="L:" bottom="87" left="250"/>
        <mx:Label text="R:" bottom="87" left="326"/>
        
        <mx:NumericStepper 
            id="bars" x="292" y="72" value="{ freqBars }" 
            change="freqBars=bars.value;fv.invalidateDisplayList();" 
            minimum="1" maximum="255"  width="82"/>
            
        <mx:Label x="250" y="74" text="Bars:"/>
        
        <mx:Button x="382" y="10" label="Stop" enabled="{ playing }" click="stop()"  width="65"/>
        
    </mx:Panel>
    <mx:Sequence id="creationCompleteEffect" >
        
        <mx:WipeDown duration="600" moveEasingFunction="Bounce.easeOut" />
        <mx:Fade duration="600" alphaFrom="{ initialAlpha }" alphaTo="{ finalAlpha }" />
        
    </mx:Sequence>
    
</mx:Application>