<?xml version="1.0" encoding="utf-8"?>
<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.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>