I'm building a voice chat manipulating voice data. I'm getting SAMPLE_DATA (ByteArray) from Microphone and sending it via NetStream send() method. Then i have to convert it back to sound. How can I do it?
This is class establishing the connection,capturing and sending voice data (i know this is ugly but it is temporary version).
package app.net {
public class CirrusConnection extends EventDispatcher {
private const SERVER_ADDRESS:String = "rtmfp://p2p.rtmfp.net/";
private const DEVELOPER_KEY:String = "bla-bla-bla";
// Net objects ~~~~~~~~~~
private var nc:NetConnection;
private var sendStream:NetStream;
private var recvStream:NetStream;
private var myPeerID:String;
private var farPeerID:String;
// User output handler
private var chatTextArea:TextArea;
//---
private var mic:Microphone;
//---
public function CirrusConnection() { }
public function initConnection():void {
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
nc.connect(SERVER_ADDRESS + DEVELOPER_KEY);
mic = Microphone.getMicrophone();
mic.rate = 8;
mic.setUseEchoSuppression(true);
mic.gain = 50;
}
private function netStatusHandler(event:NetStatusEvent):void {
trace("CirrusConnection: " + event.info.code);
switch(event.info.code) {
case "NetConnection.Connect.Success":
myPeerID = nc.nearID;
openSendStream();
dispatchEvent(new Event(NetEvent.CIRRUS_SENT_KEY));
break;
case "NetStream.Play.Start":
dispatchEvent(new Event(NetEvent.CLIENT_IS_CALLING ));
break;
}
}
public function getNetConnection():NetConnection {
return nc;
}
public function getMyPeerID():String {
return myPeerID;
}
public function isConnected():Boolean {
return Boolean(myPeerID);
}
public function setChatTextArea(chatTextArea:TextArea):void {
this.chatTextArea = chatTextArea;
}
private function openSendStream():void {
var sendStreamClient:Object = new Object();
sendStreamClient.onPeerConnect = function(callerns:NetStream):Boolean {
if (!Boolean(farPeerID)) {
connectToPeer(callerns.farID);
}
return true;
}
sendStream = new NetStream(this.nc, NetStream.DIRECT_CONNECTIONS);
sendStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
sendStream.client = sendStreamClient;
sendStream.publish("media");
}
public function connectToPeer(id:String):void {
farPeerID = id;
recvStream = new NetStream(nc,farPeerID);
recvStream.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
recvStream.client = this;
recvStream.play("media");
}
public function read(data:ByteArray):void {
var snd:Sound = new Sound();
data.position = 0;
snd.loadPCMFromByteArray(data, data.length >> 3);
snd.play();
}
public function beginStreamMicrophoneData():void {
mic.addEventListener("sampleData", streamData);
}
public function streamData(event:SampleDataEvent):void {
sendStream.send("read", event.data as ByteArray );
}
}
}
streamData function is calling when microphone data is captured. It is sending ByteArray to second peer. Second peer is getting it in read function. There will be stuff decoding it. Now it is working, but i'm getting terrible regular sound in my speakers. I will be grateful for quick response, and I thank for it in advance.