public void OnCallClick() { #if !UNITY_EDITOR lock (this) { if (status == Status.Connected) { new Task(() => { Conductor.Peer conductorPeer = Conductor.Instance.GetPeers().First(); if (conductorPeer != null) { Conductor.Instance.ConnectToPeer(conductorPeer); } }).Start(); status = Status.Calling; } else if (status == Status.InCall) { new Task(() => { var task = Conductor.Instance.DisconnectFromPeer(); }).Start(); status = Status.EndingCall; } else { System.Diagnostics.Debug.WriteLine("OnCallClick() - wrong status - " + status); } } #endif }
public void OnCallClick() { #if !UNITY_EDITOR lock (this) { if (status == Status.Connected) { if (selectedPeerIndex == -1) { return; } Debug.Log("selectedPeerIndex: " + selectedPeerIndex); string selectedRemotePeerName = PeerContent.GetChild(selectedPeerIndex).GetComponent <Text>().text; Debug.Log("selectedRemotePeerName: " + selectedRemotePeerName); new Task(() => { // given the selectedPeerIndex, find which remote peer that matches. // Note: it's not just that index in Conductor.Instance.GetPeers() because that list contains both remote peers and ourselves. Conductor.Peer selectedConductorPeer = null; var conductorPeers = Conductor.Instance.GetPeers(); foreach (var conductorPeer in conductorPeers) { if (conductorPeer.Name == selectedRemotePeerName) { selectedConductorPeer = conductorPeer; break; } } Debug.Log("selectedConductorPeer: " + selectedConductorPeer.Name); Debug.Log("going to try to connect to peer"); if (selectedConductorPeer != null) { Conductor.Instance.ConnectToPeer(selectedConductorPeer); } }).Start(); status = Status.Calling; } else if (status == Status.InCall) { new Task(() => { //var task = Conductor.Instance.DisconnectFromPeer(peerName); }).Start(); status = Status.EndingCall; } else { System.Diagnostics.Debug.WriteLine("OnCallClick() - wrong status - " + status); } } #endif }
public void OnCallClick() { #if !UNITY_EDITOR lock (this) { if (status == Status.Connected) { if (selectedPeerIndex == -1) { return; } Task.Run(async() => { Conductor.Peer conductorPeer = Conductor.Instance.GetPeers()[selectedPeerIndex]; if (conductorPeer != null) { Conductor.Instance.ConnectToPeer(conductorPeer); } }); status = Status.Calling; } else if (status == Status.InCall) { Task.Run(async() => { var task = Conductor.Instance.DisconnectFromPeer(); }); status = Status.EndingCall; } else { System.Diagnostics.Debug.WriteLine("OnCallClick() - wrong status - " + status); } } #endif }
public void Initialize() { #if !UNITY_EDITOR // A Peer is connected to the server event handler Conductor.Instance.Signaller.OnPeerConnected += (peerId, peerName) => { var task = RunOnUiThread(() => { lock (this) { Conductor.Peer peer = new Conductor.Peer { Id = peerId, Name = peerName }; Conductor.Instance.AddPeer(peer); commandQueue.Add(new Command { type = CommandType.AddRemotePeer, remotePeer = peer }); } }); }; // A Peer is disconnected from the server event handler Conductor.Instance.Signaller.OnPeerDisconnected += peerId => { var task = RunOnUiThread(() => { lock (this) { var peerToRemove = Conductor.Instance.GetPeers().FirstOrDefault(p => p.Id == peerId); if (peerToRemove != null) { Conductor.Peer peer = new Conductor.Peer { Id = peerToRemove.Id, Name = peerToRemove.Name }; Conductor.Instance.RemovePeer(peer); commandQueue.Add(new Command { type = CommandType.RemoveRemotePeer, remotePeer = peer }); } } }); }; // The user is Signed in to the server event handler Conductor.Instance.Signaller.OnSignedIn += () => { var task = RunOnUiThread(() => { lock (this) { if (status == Status.Connecting) { status = Status.Connected; commandQueue.Add(new Command { type = CommandType.SetConnected }); } else { System.Diagnostics.Debug.WriteLine("Signaller.OnSignedIn() - wrong status - " + status); } } }); }; // Failed to connect to the server event handler Conductor.Instance.Signaller.OnServerConnectionFailure += () => { var task = RunOnUiThread(() => { lock (this) { if (status == Status.Connecting) { status = Status.NotConnected; commandQueue.Add(new Command { type = CommandType.SetNotConnected }); } else { System.Diagnostics.Debug.WriteLine("Signaller.OnServerConnectionFailure() - wrong status - " + status); } } }); }; // The current user is disconnected from the server event handler Conductor.Instance.Signaller.OnDisconnected += () => { var task = RunOnUiThread(() => { lock (this) { if (status == Status.Disconnecting) { status = Status.NotConnected; commandQueue.Add(new Command { type = CommandType.SetNotConnected }); } else { System.Diagnostics.Debug.WriteLine("Signaller.OnDisconnected() - wrong status - " + status); } } }); }; Conductor.Instance.OnAddRemoteStream += Conductor_OnAddRemoteStream; Conductor.Instance.OnRemoveRemoteStream += Conductor_OnRemoveRemoteStream; Conductor.Instance.OnAddLocalStream += Conductor_OnAddLocalStream; // Connected to a peer event handler Conductor.Instance.OnPeerConnectionCreated += () => { var task = RunOnUiThread(() => { lock (this) { if (status == Status.Calling) { status = Status.InCall; commandQueue.Add(new Command { type = CommandType.SetInCall }); } else if (status == Status.Connected) { status = Status.InCall; commandQueue.Add(new Command { type = CommandType.SetInCall }); } else { System.Diagnostics.Debug.WriteLine("Conductor.OnPeerConnectionCreated() - wrong status - " + status); } } }); }; // Connection between the current user and a peer is closed event handler Conductor.Instance.OnPeerConnectionClosed += () => { var task = RunOnUiThread(() => { lock (this) { //DestroyMediaStreamSource(); if (status == Status.EndingCall) { Plugin.UnloadLocalMediaStreamSource(); Plugin.UnloadRemoteMediaStreamSource(); status = Status.Connected; commandQueue.Add(new Command { type = CommandType.SetConnected }); } else if (status == Status.InCall) { Plugin.UnloadLocalMediaStreamSource(); Plugin.UnloadRemoteMediaStreamSource(); status = Status.Connected; commandQueue.Add(new Command { type = CommandType.SetConnected }); } else { System.Diagnostics.Debug.WriteLine("Conductor.OnPeerConnectionClosed() - wrong status - " + status); } } }); }; // Ready to connect to the server event handler Conductor.Instance.OnReadyToConnect += () => { var task = RunOnUiThread(() => { }); }; List <Conductor.IceServer> iceServers = new List <Conductor.IceServer>(); iceServers.Add(new Conductor.IceServer { Host = "stun.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN }); iceServers.Add(new Conductor.IceServer { Host = "stun1.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN }); iceServers.Add(new Conductor.IceServer { Host = "stun2.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN }); iceServers.Add(new Conductor.IceServer { Host = "stun3.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN }); iceServers.Add(new Conductor.IceServer { Host = "stun4.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN }); Conductor.IceServer turnServer = new Conductor.IceServer { Host = "turnserver3dstreaming.centralus.cloudapp.azure.com:5349", Type = Conductor.IceServer.ServerType.TURN }; turnServer.Credential = "3Dtoolkit072017"; turnServer.Username = "******"; iceServers.Add(turnServer); Conductor.Instance.ConfigureIceServers(iceServers); var audioCodecList = Conductor.Instance.GetAudioCodecs(); Conductor.Instance.AudioCodec = audioCodecList.FirstOrDefault(c => c.Name == "opus"); System.Diagnostics.Debug.WriteLine("Selected audio codec - " + Conductor.Instance.AudioCodec.Name); // Order the video codecs so that the stable VP8 is in front. var videoCodecList = Conductor.Instance.GetVideoCodecs(); Conductor.Instance.VideoCodec = videoCodecList.FirstOrDefault(c => c.Name == "H264"); //System.Diagnostics.Debug.WriteLine("Selected video codec - " + Conductor.Instance.VideoCodec.Name); uint preferredWidth = 896; uint preferredHeght = 504; uint preferredFrameRate = 15; uint minSizeDiff = uint.MaxValue; Conductor.CaptureCapability selectedCapability = null; var videoDeviceList = Conductor.Instance.GetVideoCaptureDevices(); foreach (Conductor.MediaDevice device in videoDeviceList) { Conductor.Instance.GetVideoCaptureCapabilities(device.Id).AsTask().ContinueWith(capabilities => { foreach (Conductor.CaptureCapability capability in capabilities.Result) { uint sizeDiff = (uint)Math.Abs(preferredWidth - capability.Width) + (uint)Math.Abs(preferredHeght - capability.Height); if (sizeDiff < minSizeDiff) { selectedCapability = capability; minSizeDiff = sizeDiff; } //System.Diagnostics.Debug.WriteLine("Video device capability - " + device.Name + " - " + capability.Width + "x" + capability.Height + "@" + capability.FrameRate); } }).Wait(); } if (selectedCapability != null) { selectedCapability.FrameRate = preferredFrameRate; selectedCapability.MrcEnabled = true; Conductor.Instance.VideoCaptureProfile = selectedCapability; Conductor.Instance.UpdatePreferredFrameFormat(); //System.Diagnostics.Debug.WriteLine("Selected video device capability - " + selectedCapability.Width + "x" + selectedCapability.Height + "@" + selectedCapability.FrameRate); } #endif }
/// <summary> /// Initialize everything for WebRTC connection /// [internal use] /// </summary> protected void Initialize() { #if NETFX_CORE // A Peer is connected to the server event handler Conductor.Instance.Signaller.OnPeerConnected += (peerId, peerName) => { var task = RunOnUiThread(() => { lock (this) { Conductor.Peer peer = new Conductor.Peer { Id = peerId, Name = peerName }; Conductor.Instance.AddPeer(peer); commandQueue.Add(new Command { type = CommandType.AddRemotePeer, remotePeer = peer }); } }); }; // A Peer is disconnected from the server event handler Conductor.Instance.Signaller.OnPeerDisconnected += peerId => { var task = RunOnUiThread(() => { lock (this) { var peerToRemove = Conductor.Instance.GetPeers().FirstOrDefault(p => p.Id == peerId); if (peerToRemove != null) { Conductor.Peer peer = new Conductor.Peer { Id = peerToRemove.Id, Name = peerToRemove.Name }; Conductor.Instance.RemovePeer(peer); commandQueue.Add(new Command { type = CommandType.RemoveRemotePeer, remotePeer = peer }); } } }); }; // The user is Signed in to the server event handler Conductor.Instance.Signaller.OnSignedIn += () => { var task = RunOnUiThread(() => { lock (this) { if (WebRTCStatus == WebRTCStatuses.Connecting) { WebRTCStatus = WebRTCStatuses.Connected; commandQueue.Add(new Command { type = CommandType.SetConnected }); } else { System.Diagnostics.Debug.WriteLine("Signaller.OnSignedIn() - wrong status - " + WebRTCStatus); } } }); }; // Failed to connect to the server event handler Conductor.Instance.Signaller.OnServerConnectionFailure += () => { var task = RunOnUiThread(() => { lock (this) { if (WebRTCStatus == WebRTCStatuses.Connecting) { WebRTCStatus = WebRTCStatuses.NotConnected; commandQueue.Add(new Command { type = CommandType.SetNotConnected }); } else { System.Diagnostics.Debug.WriteLine("Signaller.OnServerConnectionFailure() - wrong status - " + WebRTCStatus); } } }); }; // The current user is disconnected from the server event handler Conductor.Instance.Signaller.OnDisconnected += () => { var task = RunOnUiThread(() => { lock (this) { if (WebRTCStatus == WebRTCStatuses.Disconnecting) { WebRTCStatus = WebRTCStatuses.NotConnected; commandQueue.Add(new Command { type = CommandType.SetNotConnected }); } else { System.Diagnostics.Debug.WriteLine("Signaller.OnDisconnected() - wrong status - " + WebRTCStatus); } } }); }; Conductor.Instance.OnAddRemoteStream += Conductor_OnAddRemoteStream; Conductor.Instance.OnRemoveRemoteStream += Conductor_OnRemoveRemoteStream; Conductor.Instance.OnAddLocalStream += Conductor_OnAddLocalStream; // Connected to a peer event handler Conductor.Instance.OnPeerConnectionCreated += peerName => { var task = RunOnUiThread(() => { lock (this) { if (WebRTCStatus == WebRTCStatuses.Calling) { WebRTCStatus = WebRTCStatuses.InCall; commandQueue.Add(new Command { type = CommandType.SetInCall }); } else if (WebRTCStatus == WebRTCStatuses.Connected) { WebRTCStatus = WebRTCStatuses.InCall; commandQueue.Add(new Command { type = CommandType.SetInCall }); } else { System.Diagnostics.Debug.WriteLine("Conductor.OnPeerConnectionCreated() - wrong status - " + WebRTCStatus); } } }); }; // Connection between the current user and a peer is closed event handler Conductor.Instance.OnPeerConnectionClosed += peerName => { var localId = SourceIDs[ClientName]; var remoteId = SourceIDs[MentorName]; var task = RunOnUiThread(() => { lock (this) { if (WebRTCStatus == WebRTCStatuses.EndingCall) { Plugin.UnloadMediaStreamSource(localId); Plugin.UnloadMediaStreamSource(remoteId); WebRTCStatus = WebRTCStatuses.Connected; commandQueue.Add(new Command { type = CommandType.SetConnected }); } else if (WebRTCStatus == WebRTCStatuses.InCall) { Plugin.UnloadMediaStreamSource(localId); Plugin.UnloadMediaStreamSource(remoteId); WebRTCStatus = WebRTCStatuses.Connected; commandQueue.Add(new Command { type = CommandType.SetConnected }); } else { System.Diagnostics.Debug.WriteLine("Conductor.OnPeerConnectionClosed() - wrong status - " + WebRTCStatus); } } }); }; // Ready to connect to the server event handler Conductor.Instance.OnReadyToConnect += () => { var task = RunOnUiThread(() => { }); }; List <Conductor.IceServer> iceServers = new List <Conductor.IceServer> { new Conductor.IceServer { Host = "stun.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN }, new Conductor.IceServer { Host = "stun1.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN }, new Conductor.IceServer { Host = "stun2.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN }, new Conductor.IceServer { Host = "stun3.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN }, new Conductor.IceServer { Host = "stun4.l.google.com:19302", Type = Conductor.IceServer.ServerType.STUN } }; Conductor.IceServer turnServer = new Conductor.IceServer { Host = "turnserver3dstreaming.centralus.cloudapp.azure.com:5349", Type = Conductor.IceServer.ServerType.TURN }; turnServer.Credential = "3Dtoolkit072017"; turnServer.Username = "******"; iceServers.Add(turnServer); Conductor.Instance.ConfigureIceServers(iceServers); var audioCodecList = Conductor.Instance.GetAudioCodecs(); Conductor.Instance.AudioCodec = audioCodecList.FirstOrDefault(c => c.Name == "opus"); System.Diagnostics.Debug.WriteLine("Selected audio codec - " + Conductor.Instance.AudioCodec.Name); var videoCodecList = Conductor.Instance.GetVideoCodecs(); Conductor.Instance.VideoCodec = videoCodecList.FirstOrDefault(c => c.Name == PreferredVideoCodec); System.Diagnostics.Debug.WriteLine("Selected video codec - " + Conductor.Instance.VideoCodec.Name); #endif UpdatePreferredFrameFormat(); }
public void Start() { UltrasoundTracker = GameObject.Find("UltrasoundTracker").GetComponent <ARUWPVideo>(); #if NETFX_CORE Conductor.Instance.LocalStreamEnabled = true; Debug.Log("setting up spatial coordinate system"); IntPtr spatialCoordinateSystemPtr = UnityEngine.XR.WSA.WorldManager.GetNativeISpatialCoordinateSystemPtr(); Conductor.Instance.InitializeSpatialCoordinateSystem(spatialCoordinateSystemPtr); Conductor.Instance.IncomingRawMessage += Conductor_IncomingRawMessage; Conductor.Instance.OnSelfRawFrame += Conductor_OnSelfRawFrame; Conductor.Instance.Initialized += Conductor_Initialized; Conductor.Instance.Initialize(CoreApplication.MainView.CoreWindow.Dispatcher); Conductor.Instance.EnableLogging(Conductor.LogLevel.Verbose); Debug.Log("done setting up the rest of the conductor"); // add the button to connect to server Configurations.Instance.AddCallback("*_Connect", () => { if (WebRTCStatus == WebRTCStatuses.NotConnected) { new Task(() => { Conductor.Instance.StartLogin(ServerAddress, ServerPort, ClientName); }).Start(); WebRTCStatus = WebRTCStatuses.Connecting; } else if (WebRTCStatus == WebRTCStatuses.Connected) { new Task(() => { var task = Conductor.Instance.DisconnectFromServer(); }).Start(); WebRTCStatus = WebRTCStatuses.Disconnecting; } }); // add the button to initiate the call Configurations.Instance.AddCallback("*_Call", () => { if (WebRTCStatus == WebRTCStatuses.Connected && PeerName != null) { new Task(() => { // given the selectedPeerIndex, find which remote peer that matches. // Note: it's not just that index in Conductor.Instance.GetPeers() because that list contains both remote peers and ourselves. Conductor.Peer selectedConductorPeer = null; var conductorPeers = Conductor.Instance.GetPeers(); foreach (var conductorPeer in conductorPeers) { if (conductorPeer.Name == MentorName) { selectedConductorPeer = conductorPeer; break; } } if (selectedConductorPeer != null) { Conductor.Instance.ConnectToPeer(selectedConductorPeer); } }).Start(); WebRTCStatus = WebRTCStatuses.Calling; } else if (WebRTCStatus == WebRTCStatuses.InCall) { new Task(() => { var task = Conductor.Instance.DisconnectFromPeer(MentorName); }).Start(); WebRTCStatus = WebRTCStatuses.EndingCall; } }); #endif Configurations.Instance.SetAndAddCallback("ConnectionWebRTC_AROverlay", AROverlay, v => { AROverlay = v; UpdatePreferredFrameFormat(); }); Configurations.Instance.SetAndAddCallback("ConnectionWebRTC_VideoWidth", VideoWidth, v => { VideoWidth = v; UpdatePreferredFrameFormat(); }); Configurations.Instance.SetAndAddCallback("ConnectionWebRTC_VideoHeight", VideoHeight, v => { VideoHeight = v; UpdatePreferredFrameFormat(); }); Configurations.Instance.SetAndAddCallback("ConnectionWebRTC_VideoFrameRate", VideoFrameRate, v => { VideoFrameRate = v; UpdatePreferredFrameFormat(); }); Configurations.Instance.SetAndAddCallback("Stabilization_SavePose", SaveVideo, v => { if (SaveVideo = v) { VideoFrames = File.Create(Utilities.FullPath(Utilities.TimeNow() + ".txt")); VideoBinaryWriter = new BinaryWriter(VideoFrames); } else { VideoBinaryWriter.Dispose(); VideoFrames.Dispose(); } }, Configurations.RunOnMainThead.YES, Configurations.WaitUntilDone.YES); }
public void Initialize() { // A Peer is connected to the server event handler Conductor.Instance.Signaller.OnPeerConnected += (peerId, peerName) => { RunOnUiThread(() => { lock (this) { Conductor.Peer peer = new Conductor.Peer { Id = peerId, Name = peerName }; Conductor.Instance.AddPeer(peer); commandQueue.Add(new Command { type = CommandType.AddRemotePeer, remotePeer = peer }); } }); }; // A Peer is disconnected from the server event handler Conductor.Instance.Signaller.OnPeerDisconnected += peerId => { RunOnUiThread(() => { lock (this) { var peerToRemove = Conductor.Instance.GetPeers().FirstOrDefault(p => p.Id == peerId); if (peerToRemove != null) { Conductor.Peer peer = new Conductor.Peer { Id = peerToRemove.Id, Name = peerToRemove.Name }; Conductor.Instance.RemovePeer(peer); commandQueue.Add(new Command { type = CommandType.RemoveRemotePeer, remotePeer = peer }); } } }); }; // The user is Signed in to the server event handler Conductor.Instance.Signaller.OnSignedIn += () => { RunOnUiThread(() => { lock (this) { if (status == Status.Connecting) { status = Status.Connected; commandQueue.Add(new Command { type = CommandType.SetConnected }); } else { System.Diagnostics.Debug.WriteLine("Signaller.OnSignedIn() - wrong status - " + status); } } }); }; // Failed to connect to the server event handler Conductor.Instance.Signaller.OnServerConnectionFailure += () => { RunOnUiThread(() => { lock (this) { if (status == Status.Connecting) { status = Status.NotConnected; commandQueue.Add(new Command { type = CommandType.SetNotConnected }); } else { System.Diagnostics.Debug.WriteLine("Signaller.OnServerConnectionFailure() - wrong status - " + status); } } }); }; // The current user is disconnected from the server event handler Conductor.Instance.Signaller.OnDisconnected += () => { RunOnUiThread(() => { lock (this) { if (status == Status.Disconnecting) { status = Status.NotConnected; commandQueue.Add(new Command { type = CommandType.SetNotConnected }); } else { System.Diagnostics.Debug.WriteLine("Signaller.OnDisconnected() - wrong status - " + status); } } }); }; Conductor.Instance.OnAddRemoteTrack += Conductor_OnAddRemoteTrack; Conductor.Instance.OnRemoveRemoteTrack += Conductor_OnRemoveRemoteTrack; Conductor.Instance.OnAddLocalTrack += Conductor_OnAddLocalTrack; // Connected to a peer event handler Conductor.Instance.OnPeerConnectionCreated += () => { RunOnUiThread(() => { lock (this) { if (status == Status.Calling) { status = Status.InCall; commandQueue.Add(new Command { type = CommandType.SetInCall }); } else if (status == Status.Connected) { status = Status.InCall; commandQueue.Add(new Command { type = CommandType.SetInCall }); } else { System.Diagnostics.Debug.WriteLine("Conductor.OnPeerConnectionCreated() - wrong status - " + status); } } }); }; // Connection between the current user and a peer is closed event handler Conductor.Instance.OnPeerConnectionClosed += () => { RunOnUiThread(() => { lock (this) { if (status == Status.EndingCall || status == Status.InCall) { Plugin.UnloadLocalMediaStreamSource(); Plugin.UnloadRemoteMediaStreamSource(); status = Status.Connected; commandQueue.Add(new Command { type = CommandType.SetConnected }); } else { System.Diagnostics.Debug.WriteLine("Conductor.OnPeerConnectionClosed() - wrong status - " + status); } } }); }; // Ready to connect to the server event handler Conductor.Instance.OnReadyToConnect += () => { RunOnUiThread(() => { }); }; }