public void OnConnectionStateChanged(ReceivingPeer peer, RTCPeerConnectionState connectionState)
 {
     switch (connectionState)
     {
     case RTCPeerConnectionState.closed:
         // TODO
         break;
     }
 }
 public void OnIceCandidate(ReceivingPeer peer, RTCIceCandidate iceCandidate)
 {
     _connection.SendIceCandidate(new IceCandidateArgs
     {
         ConnectionId = peer.ConnectionId,
         CandidateDto = new RtcIceCandidateDto
         {
             Candidate        = iceCandidate.candidate,
             SdpMid           = iceCandidate.sdpMid,
             SdpMLineIndex    = iceCandidate.sdpMLineIndex,
             UsernameFragment = iceCandidate.usernameFragment
         }
     });
 }
 public void OnFrameReceived(ReceivingPeer peer, Memory <byte> frame, uint rtpTimestamp, long timestamp)
 {
     _outputStream.Write(frame.Span);
 }
 public VirtualStudioClient(Stream outputStream)
 {
     _outputStream = outputStream ?? throw new ArgumentNullException(nameof(outputStream));
     _peer         = new ReceivingPeer(this, true);
 }