<?xml version="1.0" encoding="utf-8"?>

<!--    Flash 10.1 mic test - http://www.smart-page.net/blog/2009/12/30/sing-like-hal-with-the-flash-player-101/    -->

<mx:Application  
    xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="http://www.smart-page.net/as3/sp_mictest/srcview/index.html">
    
    <mx:Script>
    
        <![CDATA[       

            private var mic:Microphone;
            private var sound:Sound;
            private var channel:SoundChannel;
            
            private var da:ByteArray;
            private var ba:ByteArray;
            
            private var position:Number;
            private var speed:Number;          
            
            
            private function start_recording():void {
                
                 if(btn_record.selected){
                 
                       btn_record.label = "Stop";
                       
                      btn_play.enabled=false;
                      da = new ByteArray();
                                     
                      mic = Microphone.getMicrophone(); 
                      mic.setUseEchoSuppression(true); 
                      //mic.setLoopBack(true);
                      mic.gain = 50; 
                      mic.rate = 44; 
                     
                      mic.addEventListener(SampleDataEvent.SAMPLE_DATA, dataHandler); 
                 }else{
                      
                      btn_record.label = "Record";
                      stop_recording();
                 }       
            }
            
            private function stop_recording():void {
                 
                 btn_play.enabled=true;
                 mic.removeEventListener(SampleDataEvent.SAMPLE_DATA, dataHandler);
            }
            
            private function dataHandler(event:SampleDataEvent):void { 
                 
                while(event.data.bytesAvailable) {
                                  
                    var sample:Number = event.data.readFloat(); 
                    da.writeFloat(sample);
                }              
            }
            
            private function play_recording():void {
                 
                 if(btn_play.label != "Stop"){
                 
                         btn_play.label = "Stop";
                         
                         da.position = 0;
                    position=0;
                    
                    update_speed();
                     
                    sound = new Sound();
                    sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playSoundHandler);
                    
                    channel = sound.play();
                    channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
                    
                    ba = new ByteArray();
                    addEventListener(Event.ENTER_FRAME, onEnterFrame); 
                     
                     }else{
                     
                         channel.stop();
                         removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
                         btn_play.label = "Play";
                     }
            }
            
            private function playSoundHandler(event:SampleDataEvent):void { 
 
                 for (var i:int = 0; i < 8192 && da.bytesAvailable > 0; i++){
                 
                       da.position = int(position) * 8;
                      position += speed;

                      var sample:Number = da.readFloat();
                      
                      event.data.writeFloat(sample);
                      event.data.writeFloat(sample); 
                  }
             }
             
             private function onPlaybackComplete(event:Event):void {
             
                 btn_play.label = "Play";
                 removeEventListener(Event.ENTER_FRAME, onEnterFrame); 
             }

             
             private function update_speed():void {
             
                 speed=pitchslider.value;
             }
             
             private function onEnterFrame(event:Event):void {
            
                SoundMixer.computeSpectrum(ba, true, 1);
                hal_glow.alpha=ba.readFloat()*.8;
            }
            
        ]]>
        
    </mx:Script>
    
    <mx:Image  
        id="hal" 
        source="@Embed(source='assets/images/hal.png')" 
    />
    <mx:Image  
        id="hal_glow" 
        source="@Embed(source='assets/images/hal_glow.png')" 
        alpha="0"
    />
    
    <mx:Button 
        id="btn_record"
        x="145" 
        y="20" 
        label="Record" 
        toggle="true" 
        click="start_recording()"
    />
    <mx:Button 
        id="btn_play" 
        x="230"  
        y="20"
        label="Play" 
        enabled="false"
        click="play_recording()"
    />  
    
    <mx:Label 
        x="145" 
        y="65" 
        text="pitch:"
    />
    <mx:HSlider 
        id="pitchslider" 
        x="145" 
        y="80" 
        value="0.4" 
        minimum="0.1" 
        maximum="1.0" 
        snapInterval="0.1" 
        liveDragging="true" 
        change="update_speed()"
    /> 
    
</mx:Application>