forked from: forked from: マイク入力テスト(FP10.1専用)

by Aksor.Al forked from forked from: マイク入力テスト(FP10.1専用) (diff: 1)
♥0 | Line 84 | Modified 2011-01-04 06:55:11 | MIT License
play

ActionScript3 source code

/**
 * Copyright Aksor.Al ( http://wonderfl.net/user/Aksor.Al )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/dPCF
 */

// forked from TheCoolMuseum's forked from: マイク入力テスト(FP10.1専用)
// forked from TheCoolMuseum's マイク入力テスト(FP10.1専用)
package {
    import flash.display.*;
    import flash.media.*;
    import flash.events.*;
    import flash.text.*;
    import flash.utils.*;
    import flash.display.*;
    
    public class FlashTest extends Sprite {
        public function FlashTest() {
            var canvas:BitmapData = new BitmapData(stage.stageWidth,stage.stageHeight,true);
            addChild(new Bitmap(canvas));
            var workArray:Array = [0,0,0,0,0,0];
            var mic:Microphone = Microphone.getMicrophone();
            mic.gain = 100;
            mic.rate = 44;
            mic.addEventListener(SampleDataEvent.SAMPLE_DATA, micSampleDataHandler);

            var soundBytes:ByteArray = null;;
            var soundQueue:Array =  [];

            var sound:Sound = new Sound();
            sound.addEventListener(SampleDataEvent.SAMPLE_DATA, playbackSampleHandler);
            sound.play();
            
            var rot:Number = 0;

            function micSampleDataHandler(event:SampleDataEvent):void
            {
                var bytes:ByteArray = new ByteArray();
                canvas.lock();
                
                rot+=0.03;
                var c:Number = Math.cos(rot);
                var s:Number = Math.sin(rot);
                
                while(event.data.bytesAvailable)
                {
                    var sample:Number = event.data.readFloat();
                    bytes.writeFloat(sample);
                    
                    workArray.push(sample);
                    workArray.shift();
                    
                    var px:Number = workArray[0]*c-workArray[1]*s;
                    var py:Number = workArray[0]*s+workArray[1]*c;
                    px = (px*0.5+0.5)*stage.stageWidth;
                    py = (py*0.5+0.5)*stage.stageHeight;
                    var color:Number =  int((workArray[2]*0.5+0.5)*255)<<24 + 
                                        int((workArray[3]*0.5+0.5)*255)<<16 + 
                                        int((workArray[4]*0.5+0.5)*255)<<8 + 
                                        int((workArray[5]*0.5+0.5)*255);
                    canvas.setPixel32(px, py, color);
                    
                }
                canvas.unlock();
                soundQueue.push(bytes);
            }

            function playbackSampleHandler(event:SampleDataEvent):void
            {
                if (soundQueue.length == 0) {
                    for (var j:int = 0; j < 8192; j++) 
                    {
                        event.data.writeFloat(0);
                        event.data.writeFloat(0);
                    }
                }else {
                    if (soundBytes == null) {
                        soundBytes = soundQueue.shift();
                        soundBytes.position = 0;
                    }
                    for (var i:int = 0; i < 8192; i++) 
                    {
                        if (soundBytes.bytesAvailable <= 0) {
                            if (soundQueue.length == 0) {
                                soundBytes = null;
                                for (; i < 8192; i++ ) {
                                    event.data.writeFloat(0);
                                    event.data.writeFloat(0);
                                }
                            }else{
                                soundBytes = soundQueue.shift();
                                soundBytes.position = 0;
                            }
                        }
                        var sample:Number = soundBytes.readFloat();
                        event.data.writeFloat(sample);
                        event.data.writeFloat(sample);
                    }
                }
            }
        }
        
    }
    }