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

by TheCoolMuseum forked from マイク入力テスト(FP10.1専用) (diff: 27)
♥0 | Line 84 | Modified 2009-11-17 19:28:53 | MIT License
play

ActionScript3 source code

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

// 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);
					}
				}
			}
		}
		
	}
	}

Forked