AutomaticStreaming.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. using System;
  2. using System.Linq;
  3. using Unity.Collections;
  4. using Unity.RenderStreaming.InputSystem;
  5. using Unity.WebRTC;
  6. using UnityEngine;
  7. using UnityEngine.InputSystem;
  8. using UnityEngine.InputSystem.Users;
  9. using UnityEngine.SceneManagement;
  10. namespace Unity.RenderStreaming
  11. {
  12. internal class AutomaticStreaming : MonoBehaviour
  13. {
  14. private SignalingManager renderstreaming;
  15. private Broadcast broadcast;
  16. private VideoStreamSender videoStreamSender;
  17. private AudioStreamSender audioStreamSender;
  18. private AutoInputReceiver inputReceiver;
  19. private void Awake()
  20. {
  21. gameObject.hideFlags = HideFlags.HideInHierarchy;
  22. broadcast = gameObject.AddComponent<Broadcast>();
  23. videoStreamSender = gameObject.AddComponent<VideoStreamSender>();
  24. videoStreamSender.source = VideoStreamSource.Screen;
  25. videoStreamSender.SetTextureSize(new Vector2Int(Screen.width, Screen.height));
  26. broadcast.AddComponent(videoStreamSender);
  27. audioStreamSender = gameObject.AddComponent<AudioStreamSender>();
  28. audioStreamSender.source = AudioStreamSource.APIOnly;
  29. broadcast.AddComponent(audioStreamSender);
  30. inputReceiver = gameObject.AddComponent<AutoInputReceiver>();
  31. broadcast.AddComponent(inputReceiver);
  32. renderstreaming = gameObject.AddComponent<SignalingManager>();
  33. renderstreaming.AddSignalingHandler(broadcast);
  34. renderstreaming.Run();
  35. SceneManager.activeSceneChanged += (scene1, scene2) =>
  36. {
  37. var audioListener = FindObjectOfType<AudioListener>();
  38. if (audioListener == null || audioListener.gameObject.GetComponent<AutoAudioFilter>() != null)
  39. {
  40. return;
  41. }
  42. var autoFilter = audioListener.gameObject.AddComponent<AutoAudioFilter>();
  43. autoFilter.SetSender(audioStreamSender);
  44. };
  45. }
  46. private void OnDestroy()
  47. {
  48. renderstreaming.Stop();
  49. renderstreaming = null;
  50. broadcast = null;
  51. videoStreamSender = null;
  52. audioStreamSender = null;
  53. inputReceiver = null;
  54. }
  55. class AutoAudioFilter : MonoBehaviour
  56. {
  57. private AudioStreamSender sender;
  58. public void SetSender(AudioStreamSender sender)
  59. {
  60. this.sender = sender;
  61. }
  62. private void Awake()
  63. {
  64. this.hideFlags = HideFlags.HideInInspector;
  65. }
  66. private void OnAudioFilterRead(float[] data, int channels)
  67. {
  68. if (sender == null || sender.source != AudioStreamSource.APIOnly)
  69. {
  70. return;
  71. }
  72. var nativeArray = new NativeArray<float>(data, Allocator.Temp);
  73. sender.SetData(ref nativeArray, channels);
  74. }
  75. private void OnDestroy()
  76. {
  77. sender = null;
  78. }
  79. }
  80. class AutoInputReceiver : InputChannelReceiverBase
  81. {
  82. public override event Action<InputDevice, InputDeviceChange> onDeviceChange;
  83. protected virtual void OnEnable()
  84. {
  85. onDeviceChange += OnDeviceChange;
  86. }
  87. protected virtual void OnDisable()
  88. {
  89. onDeviceChange -= OnDeviceChange;
  90. }
  91. private void PerformPairingWithDevice(InputDevice device)
  92. {
  93. inputUser = InputUser.PerformPairingWithDevice(device, inputUser);
  94. }
  95. private void UnpairDevices(InputDevice device)
  96. {
  97. if (!inputUser.valid)
  98. return;
  99. inputUser.UnpairDevice(device);
  100. }
  101. public override void SetChannel(string connectionId, RTCDataChannel channel)
  102. {
  103. if (channel == null)
  104. {
  105. Dispose();
  106. }
  107. else
  108. {
  109. AssignUserAndDevices();
  110. receiver = new Receiver(channel);
  111. receiver.onDeviceChange += onDeviceChange;
  112. receiverInput = new InputSystem.InputRemoting(receiver);
  113. subscriberDisposer = receiverInput.Subscribe(receiverInput);
  114. receiverInput.StartSending();
  115. }
  116. base.SetChannel(connectionId, channel);
  117. }
  118. protected virtual void OnDestroy()
  119. {
  120. Dispose();
  121. }
  122. protected virtual void Dispose()
  123. {
  124. receiverInput?.StopSending();
  125. subscriberDisposer?.Dispose();
  126. receiver?.Dispose();
  127. receiver = null;
  128. }
  129. [NonSerialized] private InputUser inputUser;
  130. [NonSerialized] private Receiver receiver;
  131. [NonSerialized] private InputSystem.InputRemoting receiverInput;
  132. [NonSerialized] private IDisposable subscriberDisposer;
  133. private void AssignUserAndDevices()
  134. {
  135. inputUser = InputUser.all.FirstOrDefault();
  136. }
  137. protected virtual void OnDeviceChange(InputDevice device, InputDeviceChange change)
  138. {
  139. switch (change)
  140. {
  141. case InputDeviceChange.Added:
  142. PerformPairingWithDevice(device);
  143. return;
  144. case InputDeviceChange.Removed:
  145. UnpairDevices(device);
  146. return;
  147. }
  148. }
  149. }
  150. }
  151. }