SignalingEventProvider.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using System;
  2. using System.Collections.Generic;
  3. using Unity.WebRTC;
  4. using UnityEngine;
  5. using UnityEngine.EventSystems;
  6. namespace Unity.RenderStreaming
  7. {
  8. internal class SignalingEventProvider
  9. {
  10. private List<WeakReference<GameObject>> m_list = new List<WeakReference<GameObject>>();
  11. public SignalingEventProvider(IRenderStreamingDelegate handler)
  12. {
  13. handler.onCreatedConnection += OnCreatedConnection;
  14. handler.onDeletedConnection += OnDeletedConnection;
  15. handler.onConnect += OnConnect;
  16. handler.onDisconnect += OnDisconnect;
  17. handler.onGotOffer += OnGotOffer;
  18. handler.onGotAnswer += OnGotAnswer;
  19. handler.onAddChannel += OnAddChannel;
  20. handler.onAddTransceiver += OnAddReceiver;
  21. }
  22. public bool Subscribe(Component comp)
  23. {
  24. if (Find(comp.gameObject) != null)
  25. return false;
  26. m_list.Add(new WeakReference<GameObject>(comp.gameObject));
  27. return true;
  28. }
  29. public bool Unsubscribe(Component comp)
  30. {
  31. var a = Find(comp.gameObject);
  32. if (a == null)
  33. return false;
  34. m_list.Remove(a);
  35. return true;
  36. }
  37. private WeakReference<GameObject> Find(GameObject obj)
  38. {
  39. return m_list.Find(r =>
  40. {
  41. if (!r.TryGetTarget(out var _obj))
  42. return false;
  43. return obj == _obj;
  44. });
  45. }
  46. private void ExecuteEventToAllTargets<T>(
  47. BaseEventData data, ExecuteEvents.EventFunction<T> functor)
  48. where T : IEventSystemHandler
  49. {
  50. foreach (var r in m_list)
  51. {
  52. if (!r.TryGetTarget(out var obj))
  53. continue;
  54. ExecuteEvents.Execute(obj, data, functor);
  55. }
  56. }
  57. private void OnCreatedConnection(string connectionId)
  58. {
  59. var data = new SignalingEventData(EventSystem.current)
  60. {
  61. connectionId = connectionId
  62. };
  63. ExecuteEventToAllTargets(data, ExecuteSignalingEvents.createdConnectionHandler);
  64. }
  65. private void OnDeletedConnection(string connectionId)
  66. {
  67. var data = new SignalingEventData(EventSystem.current)
  68. {
  69. connectionId = connectionId
  70. };
  71. ExecuteEventToAllTargets(data, ExecuteSignalingEvents.deletedConnectionHandler);
  72. }
  73. private void OnGotOffer(string connectionId, string sdp)
  74. {
  75. var data = new SignalingEventData(EventSystem.current)
  76. {
  77. connectionId = connectionId,
  78. sdp = sdp
  79. };
  80. ExecuteEventToAllTargets(data, ExecuteSignalingEvents.offerHandler);
  81. }
  82. private void OnGotAnswer(string connectionId, string sdp)
  83. {
  84. var data = new SignalingEventData(EventSystem.current)
  85. {
  86. connectionId = connectionId,
  87. sdp = sdp
  88. };
  89. ExecuteEventToAllTargets(data, ExecuteSignalingEvents.answerHandler);
  90. }
  91. private void OnConnect(string connectionId)
  92. {
  93. var data = new SignalingEventData(EventSystem.current)
  94. {
  95. connectionId = connectionId
  96. };
  97. ExecuteEventToAllTargets(data, ExecuteSignalingEvents.connectHandler);
  98. }
  99. private void OnDisconnect(string connectionId)
  100. {
  101. var data = new SignalingEventData(EventSystem.current)
  102. {
  103. connectionId = connectionId
  104. };
  105. ExecuteEventToAllTargets(data, ExecuteSignalingEvents.disconnectHandler);
  106. }
  107. private void OnAddChannel(string connectionId, RTCDataChannel channel)
  108. {
  109. var data = new SignalingEventData(EventSystem.current)
  110. {
  111. connectionId = connectionId,
  112. channel = channel
  113. };
  114. ExecuteEventToAllTargets(data, ExecuteSignalingEvents.addChannelHandler);
  115. }
  116. private void OnAddReceiver(string connectionId, RTCRtpTransceiver transceiver)
  117. {
  118. var data = new SignalingEventData(EventSystem.current)
  119. {
  120. connectionId = connectionId,
  121. transceiver = transceiver
  122. };
  123. ExecuteEventToAllTargets(data, ExecuteSignalingEvents.addReceiverHandler);
  124. }
  125. }
  126. }