コード例 #1
0
    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
    }
コード例 #2
0
    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
    }
コード例 #3
0
    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
    }
コード例 #4
0
    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
    }
コード例 #5
0
        /// <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();
        }
コード例 #6
0
        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);
        }
コード例 #7
0
    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(() => { }); };
    }