From d98eab59a3e2994d66a60a1de0e8290f835db3bb Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Tue, 19 Feb 2013 16:14:41 -0800 Subject: [PATCH] Initial commit, ongoing refactoring and audio channels --- .gitignore | 1 + p2p.fla | Bin 0 -> 75683 bytes p2p.swf | Bin 0 -> 2491 bytes sqwiggle/Member.as | 1 + sqwiggle/Self.as | 1 + sqwiggle/p2p.as | 1 + 6 files changed, 4 insertions(+) create mode 100644 .gitignore create mode 100644 p2p.fla create mode 100644 p2p.swf create mode 100644 sqwiggle/Member.as create mode 100644 sqwiggle/Self.as create mode 100644 sqwiggle/p2p.as diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/p2p.fla b/p2p.fla new file mode 100644 index 0000000000000000000000000000000000000000..a43dd75eb23990fd25d274f86164335f281c0153 GIT binary patch literal 75683 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 literal 0 HcmV?d00001 diff --git a/p2p.swf b/p2p.swf new file mode 100644 index 0000000000000000000000000000000000000000..6f3cdf9c55bdbdba8ba539cdabd4c920b69c12c5 GIT binary patch literal 2491 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 F$Ykj!?;rpG literal 0 HcmV?d00001 diff --git a/sqwiggle/Member.as b/sqwiggle/Member.as new file mode 100644 index 0000000..c7354b9 --- /dev/null +++ b/sqwiggle/Member.as @@ -0,0 +1 @@ +package sqwiggle { import flash.display.Sprite; import flash.events.NetStatusEvent; import flash.media.Video; import flash.media.SoundChannel; import flash.net.NetConnection; import flash.net.NetStream; import flash.display.Shape; import flash.display.MovieClip; import flash.events.MouseEvent; import flash.utils.Timer; public class Member extends Sprite { public var connection :NetConnection; public var userId :String; public var peerId :String; var stream:NetStream; var video :Video; var rectangle:Shape; var bar:MovieClip; var t:MovieClip; public function Member(userId:String, peerId:String) { this.userId = userId; this.peerId = peerId; rectangle = new Shape; // initializing the variable named rectangle rectangle.graphics.beginFill(0xFF0000); // choosing the colour for the fill, here it is red rectangle.graphics.drawRect(0, 0, 320,240); // (x spacing, y spacing, width, height) rectangle.graphics.endFill(); // not always needed but I like to put it in to end the fill video = new Video(); video.width = 291; video.height = 218; addChild(video); bar = new fuckyou(); bar.y = video.height; bar.visible=false; addChild(bar); t = new talk(); t.x = 4; t.buttonMode=true; t.useHandCursor=true; t.y = video.height - 4; addChild(t); t.visible=false; addEventListener(MouseEvent.MOUSE_OVER, mover); addEventListener(MouseEvent.MOUSE_OUT, mout); } public function connectToVideo(videoConnection:NetConnection):void { //trace('Connecting to id: ' + id + ', stream: ' + peerId); stream = new NetStream(videoConnection, peerId); stream.addEventListener(NetStatusEvent.NET_STATUS, onVideoStatus); stream.play(this.userId); video.attachNetStream(stream); } public function connectToAudio(audioConnection:NetConnection, peerId:String):void { //trace('Connecting to id: ' + id + ', stream: ' + peerId); var astream = new NetStream(audioConnection, peerId); astream.addEventListener(NetStatusEvent.NET_STATUS, onVideoStatus); astream.play('audio-' + this.userId); // todo: does this need a separate object? video.attachNetStream(astream); } public function onVideoStatus(e:NetStatusEvent):void { //trace('Member ' + peerId + ': ' + e.info.code); } public function remove():void { removeChild(video); stream.close(); //removeChild(rectangle); } function mover(e:*):void { bar.visible = true; t.visible = true; } function mout(e:*):void { bar.visible = false; t.visible = false; } } } \ No newline at end of file diff --git a/sqwiggle/Self.as b/sqwiggle/Self.as new file mode 100644 index 0000000..b667182 --- /dev/null +++ b/sqwiggle/Self.as @@ -0,0 +1 @@ +package sqwiggle { import flash.events.NetStatusEvent; import flash.media.Camera; import flash.net.NetConnection; import flash.net.NetStream; import sqwiggle.Member; import flash.media.Microphone; import flash.events.MouseEvent; import fl.motion.MotionEvent; public class Self extends Member { var cam:Camera; public function Self(userId:String, peerId:String) { super(userId, peerId); cam = Camera.getCamera(); cam.setQuality(0, 100); } public override function connectToAudio(audioConnection:NetConnection, peerId:String):void { var stream = new NetStream(audioConnection, NetStream.DIRECT_CONNECTIONS); stream.addEventListener(NetStatusEvent.NET_STATUS, onAudioStatus); stream.attachAudio(Microphone.getMicrophone()); stream.publish('audio-' + this.userId); } public function onAudioStatus(e:NetStatusEvent):void { // nothing here just yet } public override function connectToVideo(videoConnection:NetConnection):void { //trace('Publishing to id ' + id + ', stream: ' + peerId); var stream = new NetStream(videoConnection, NetStream.DIRECT_CONNECTIONS); stream.addEventListener(NetStatusEvent.NET_STATUS, onVideoStatus); stream.attachCamera(this.cam); stream.publish(this.userId); var client:Object = new Object(); client.onPeerConnect = function(caller:NetStream):Boolean { trace('Callee connecting to stream: ' + caller.farID); return true; }; stream.client = client; video.attachCamera(this.cam); video.smoothing = true; video.deblocking = 5; } } } \ No newline at end of file diff --git a/sqwiggle/p2p.as b/sqwiggle/p2p.as new file mode 100644 index 0000000..866f0d0 --- /dev/null +++ b/sqwiggle/p2p.as @@ -0,0 +1 @@ +package sqwiggle { import flash.display.LoaderInfo; import flash.display.Sprite; import flash.display.StageAlign; import flash.events.NetStatusEvent; import flash.external.ExternalInterface; import flash.net.NetConnection; import flash.events.MouseEvent; import sqwiggle.Self; import sqwiggle.Member; public class p2p extends Sprite { var flashvars :Object; var videoConnection :NetConnection; var audioConnection :NetConnection; var self :Self; var members :Array; var conversation :Array; var conversationInitiator :Boolean; public function p2p() { flashvars = LoaderInfo(this.root.loaderInfo).parameters; members = new Array(); conversation = new Array(); stage.align = StageAlign.TOP; ExternalInterface.addCallback('addMembers', addMembers); ExternalInterface.addCallback('addMember', addMember); ExternalInterface.addCallback('removeMember', removeMember); ExternalInterface.addCallback('updateAudioChannel', updateAudioChannel); videoConnection = new NetConnection(); videoConnection.addEventListener(NetStatusEvent.NET_STATUS, onVideoStatus); videoConnection.connect('rtmfp://p2p.rtmfp.net', '56ec6665a4c675c72fb85db7-b6153286fa1e'); var client:Object = new Object(); client.onRelay = function(id:String):void { trace('onRelay: ' + id); } videoConnection.client = client; } private function onVideoStatus(e:NetStatusEvent):void { switch (e.info.code) { case 'NetConnection.Connect.Success': self = new Self(flashvars.self_id, videoConnection.nearID); self.connectToVideo(videoConnection); addChild(self); trace('adding self (`id` => ' + flashvars.self_id + ', `peerId` => ' + videoConnection.nearID) ExternalInterface.call('update_peer_id', flashvars.self_id, videoConnection.nearID); break; } } public function addMembers(strIds:String, strPeerIds:String):void { trace(strIds, strPeerIds); var ids :Array = strIds .split(','); var peerIds:Array = strPeerIds.split(','); for (var i = 0; i < peerIds.length; i++) { if (peerIds[i] != videoConnection.nearID) addMember(ids[i], peerIds[i]); } } public function updateAudioChannel(strIds:String, strPeerIds:String):void { trace(strIds, strPeerIds); var ids :Array = strIds .split(','); var peerIds:Array = strPeerIds.split(','); if (audioConnection) { // TODO: handle this } else { audioConnection = new NetConnection(); audioConnection.addEventListener(NetStatusEvent.NET_STATUS, onAudioStatus); audioConnection.connect('rtmfp://p2p.rtmfp.net', '56ec6665a4c675c72fb85db7-b6153286fa1e'); } // for all the peers in the conversation for (var i = 0; i < peerIds.length; i++) { // check that it isn't ourself if (peerIds[i] != audioConnection.nearID) { // for all members in the company for (var j in members) { // if this member should be in the conversation if (members[j].peerId == peerIds[i]) { // make sure they are // TODO: what happens if they already are connected? members[j].connectToAudio(audioConnection, peerIds[i]); break; } } } } } public function addMember(memberId:String, peerId:String):void { // prevent multiple connections if the user opens another tab if (self.userId === memberId) return; trace('new member (`id` => ' + memberId + ', `peerId` => ' + peerId) var member:Member = new Member(memberId, peerId); member.connectToVideo(videoConnection); member.addEventListener(MouseEvent.CLICK, createAudioChannel); addChild(member); members.push(member); //trace(members.length + ' .. x: ' + 320*((members.length) % 3) + ' y: ' + 240*(Math.ceil((members.length) / 3))); member.x = member.width * (members.length % 3); member.y = member.height * (Math.ceil((members.length+1) / 3)-1); trace('pos: ' + member.x + ', ' + member.y + ', members: ' + members.length); } public function removeMember(id:String) { trace('member left (`id` => ' + id + ')'); for (var i = 0; i < members.length; i++) { var member = members[i]; if (member.userId === id) { member.remove(); removeChild(member); members.splice(i, 1); break; } } for (i = 0; i < members.length; i++) { member = members[i]; member.x = member.width * ((i+1) % 3); member.y = member.height * (Math.ceil((i+2) / 3)-1); trace('repos: ' + member.x + ', ' + member.y + ', members: ' + members.length); } } private function createAudioChannel(event:MouseEvent):void { // already existing connection if (audioConnection) { // TODO: make sure that this connection is to the correct people // TODO: ensure mic is unmuted // no connection available, were creating a new audio chat } else { conversationInitiator = true; // create a new audio channel audioConnection = new NetConnection(); audioConnection.addEventListener(NetStatusEvent.NET_STATUS, onAudioStatus); audioConnection.connect('rtmfp://p2p.rtmfp.net', '56ec6665a4c675c72fb85db7-b6153286fa1e'); // add this user to the conversation conversation.push(event.target); } } private function onAudioStatus(e:NetStatusEvent):void { switch (e.info.code) { case 'NetConnection.Connect.Success': // connect to the stream ourselves self.connectToAudio(audioConnection, audioConnection.nearID); if (conversationInitiator) { // and add people in conversation to the stream sendAudioRequests(); } break; } } private function sendAudioRequests():void { var userIds:Array = new Array(); var peerIds:Array = new Array(); for (var i in conversation) { userIds.push(conversation[i].userId); peerIds.push(conversation[i].peerId); } for (var j in conversation) { if (conversation[j].userId === self.userId) return; ExternalInterface.call('sendAudioRequest', conversation[j].userId, userIds.join(','), peerIds.join(',')); } } } } \ No newline at end of file