In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

RTMFP Voice Chat test

Now building....
Get Adobe Flash player
by Fake 27 Oct 2010
/*
FlashPlayer10.1から追加された、RTMFPのピアアシストネットワークを使用して、
P2Pクラスタを構成してボイスチャット
Stratus(Cirrus)への接続は私のものを使用していますので、forkされる場合は各自変更お願いします。
左上のボックスにチャンネル名を入力してEnterキーを押すと接続します。
同一のチャンネル名に接続した同士がボイスチャット出来ます。
各チャンネルは独立しています。
自分の声がループバックして聞こえるのは気のせいということにしてください。

NetGroupの理解不足で、正常に動作してません。
*/

package {
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.events.NetStatusEvent;
    import flash.net.*;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.text.TextFieldAutoSize;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.external.ExternalInterface;
    import flash.text.TextField;
    import flash.text.TextFieldType;
    import flash.media.Microphone;

    public class RTMFPVoiceChat extends Sprite {
        private var debugout:TextField;
        private var chTxt:TextField;
        private var ar:Array;
        private var logar:Array;
        private var gs:GroupSpecifier;
        private var nc:NetConnection;
        private var nsr:NetStream;
        private var nss:NetStream;
        private var group:NetGroup;

        public function RTMFPVoiceChat() {
            // init debugout
            debugout = new TextField();
            debugout.x = 50;
            debugout.y = 50;
            debugout.autoSize = TextFieldAutoSize.LEFT;
            debugout.background = true;
            debugout.border = true;
            debugout.backgroundColor = 0x000000;
            debugout.textColor = 0x0000FF;
            addChild(debugout);
            chTxt = new TextField();
            chTxt.border = true;
            chTxt.multiline = false;
            chTxt.width = 100;
            chTxt.height = 20;
            chTxt.restrict = "A-Za-z0-9";
            chTxt.type = TextFieldType.INPUT;
            chTxt.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
            addChild(chTxt);
        }

        private function onKeyDown(e:KeyboardEvent):void {
            if (e.keyCode == Keyboard.ENTER) {
                chTxt.border = false;
                chTxt.type = TextFieldType.DYNAMIC;
                chTxt.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
                // init rtmfp group spec
                gs = new GroupSpecifier("net.wonderfl.fake.voicechat." + chTxt.text);
                gs.postingEnabled = true;
                gs.ipMulticastMemberUpdatesEnabled = true;
                gs.multicastEnabled = true;
                gs.objectReplicationEnabled = true;
                gs.routingEnabled = true;
                gs.serverChannelEnabled = true;
                // init rtmfp connection
                nc = new NetConnection();
                nc.addEventListener(NetStatusEvent.NET_STATUS, procNetStatus);
                nc.connect("rtmfp://p2p.rtmfp.net/445d9931dfac67103408ae5f-ad98e28e2386/");
            }
        }
        
        private function initStream():void {
            nsr = new NetStream(nc, gs.toString());
            nsr.play(chTxt.text);
            nss = new NetStream(nc, gs.toString());
            nss.attachAudio(Microphone.getMicrophone());
            nss.publish(chTxt.text);
        }
        
        private function procNetStatus(e:NetStatusEvent):void {
            debugout.appendText(e.info.code + "\n");
            switch (e.info.code) {
                case "NetConnection.Connect.Success":
                    group = new NetGroup(nc, gs.groupspecWithAuthorizations());
                    group.addEventListener(NetStatusEvent.NET_STATUS, procNetStatus);
                    break;
                case "NetGroup.Connect.Success":
                    initStream();
                    break;
                case "NetGroup.Neighbor.Connect":
                    break;
                case "NetGroup.Posting.Notify":
                    break;
                case "NetGroup.Replication.Request":
                    break;
                case "NetGroup.Replication.Fetch.Result":
                    break;
            }
        }
    }
}