<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();" viewSourceURL="srcview/index.html">
    <mx:Script>
        <![CDATA[
        
            /**
            * 5 band EQ
            * Original @author leo@blixtsystems.com
            * http://www.blixtsystems.com/2008/05/simple-3-band-eq-with-flash-player-10/
            * 
            * Adapted by kevin@ciboloweb.com
            * http://ciboloweb.com/flex-sound-equalizer
            */
            
            import mx.controls.VSlider;
            import __AS3__.vec.Vector;
            public static const BUFFER_SIZE:int = 4096;
            public static const SAMPLE_RATE:int = 44100;
            
            private const _soundURI:String = "loop.mp3";
            /* Sound loop from http://www.flashkit.com/loops/Ambient/Electronica/Feeling_-Mike_Gar-7333/index.php */
            
            private const _out_snd:Sound = new Sound();
            private const _eqL:EQ = new EQ();
            private const _eqR:EQ = new EQ();
            private const _loop_snd:Sound = new Sound();
            
             // For storing dynamically created VSliders
            private const _sliders_vect:Vector.<VSlider> = new Vector.<VSlider>();
            
            private var _samples:ByteArray;
            
            public function init():void
            {
                setupEQ();
                loadSound();
            }
            
            private function loadSound():void 
            {
                _loop_snd.addEventListener(Event.COMPLETE, loadSoundComplete);
                _loop_snd.addEventListener(IOErrorEvent.IO_ERROR, loadSoundError);
                _loop_snd.load(new URLRequest(_soundURI));
            }
            
            private function loadSoundComplete(event:Event):void 
            {
                startPlay();
            }
            
            
            private function startPlay():void 
            {
                _out_snd.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
                _out_snd.play();
            }
            
            private function loadSoundError(event:Event):void 
            {
                trace("loadError");
            }
            
            // Create Sliders for changing EQ gain
            private function setupEQ():void 
            {                
                var slider:VSlider;
                for (var i:int = 0; i < _eqL.gains.length; i++) {
                    slider = new VSlider();
                    slider.x = (i * 35);
                    slider.y = 20;
                    slider.value = .5;
                    slider.maximum = 1;
                    slider.minimum = 0;
                    slider.addEventListener("change", changeEQHandler);
                    addChild(slider);
                    _sliders_vect[i] = slider;
                }
                var event:Event = new Event("change");
                changeEQHandler(event);
            }    
            
            private function processSound(event:SampleDataEvent):void {
                _samples = new ByteArray();
                var len:Number = _loop_snd.extract(_samples, BUFFER_SIZE);
                var i:int=0;
                var l:Number;
                var r:Number;
                
                if ( len < BUFFER_SIZE ) { // If end of MP3, start over
                    len += _loop_snd.extract(_samples,BUFFER_SIZE-len,0);
                }
                _samples.position = 0;
                while (i < BUFFER_SIZE) {
                    event.data.writeFloat(_eqL.compute(_samples.readFloat()));
                    event.data.writeFloat(_eqR.compute(_samples.readFloat()));
                    i++;
                }
            }
            
            // Update EQ gains when sliders are changed
            private function changeEQHandler(event:Event):void 
            {    
                var i:int = 0;
                for(i = 0; i < _eqL.gains.length; i++){
                    _eqL.gains[i] = _sliders_vect[i].value * 2;
                }
                
                for(i = 0; i < _eqR.gains.length; i++){
                    _eqR.gains[i] = _sliders_vect[i].value * 2;
                }
            }
        ]]>
    </mx:Script>
    
</mx:Application>