internal static extern IntPtr PeerConnectionObserver_new(WebrtcUnityStateCallback SignalingChange, WebrtcUnityResultCallback DataChannel, WebrtcUnityCallback RenegotiationNeeded, WebrtcUnityStateCallback IceConnectionChange, WebrtcUnityStateCallback StandardizedIceConnectionChange, WebrtcUnityStateCallback ConnectionChange, WebrtcUnityStateCallback IceGatheringChange, WebrtcUnityResultCallback IceCandidate, WebrtcUnityResultCallback IceCandidatesRemoved, WebrtcUnityStateCallback IceConnectionReceivingChange, WebrtcUnityResultCallback AddTrack, WebrtcUnityResultCallback RemoveTrack, WebrtcUnityStateCallback InterestingUsage);
/// <summary> /// 持有一个数据接收器 /// </summary> /// <param name="handler">数据接收器指针</param> internal protected RtpReceiver(IntPtr handler, IDispatcher dispatcher) : base(handler) { IntPtr track = default; dispatcher.Invoke(() => { WebrtcObject_AddRef(handler); track = RtpReceiver_GetMediaStreamTrack(handler); }); Dispatcher = dispatcher; if (track == IntPtr.Zero) { throw new Exception("无法获取媒体轨道"); } IntPtr proxyPtr = default; dispatcher.Invoke(() => proxyPtr = MediaStreamTrack.MediaStreamTrack_GetKind(track)); if (proxyPtr == IntPtr.Zero) { throw new Exception("无法获取媒体类型"); } var buffer = new PointerArray(proxyPtr); unsafe { byte **pointer = (byte **)buffer.GetBuffer(); var kind = new string((sbyte *)*pointer); if (kind == "video") { Track = new VideoTrack(track, dispatcher); } else if (kind == "audio") { Track = new AudioTrack(track, dispatcher); } else { var unkown = new UnkownMediaStreamTrack(track, dispatcher); unkown.SetKind(kind); Track = unkown; } } NativeFirstPacketReceived = state => FirstPacketReceived?.Invoke((MediaType)state); dispatcher.Invoke(() => RtpReceiver_SetFirstPacketReceivedObserve(handler, NativeFirstPacketReceived)); }
/// <summary> /// C++ API:设置首次接到数据包的回调 /// </summary> /// <param name="ptr">接收器指针</param> /// <param name="FirstPacketReceived">首次接到数据包的回调</param> [DllImport(UnityPluginDll)] internal static extern void RtpReceiver_SetFirstPacketReceivedObserve(IntPtr ptr, WebrtcUnityStateCallback FirstPacketReceived);