Broadcast.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. namespace Unity.RenderStreaming
  5. {
  6. public class Broadcast : SignalingHandlerBase,
  7. IOfferHandler, IAddChannelHandler, IDisconnectHandler, IDeletedConnectionHandler,
  8. IAddReceiverHandler
  9. {
  10. [SerializeField] private List<Component> streams = new List<Component>();
  11. private List<string> connectionIds = new List<string>();
  12. public override IEnumerable<Component> Streams => streams;
  13. public void AddComponent(Component component)
  14. {
  15. streams.Add(component);
  16. }
  17. public void RemoveComponent(Component component)
  18. {
  19. streams.Remove(component);
  20. }
  21. public void OnDeletedConnection(SignalingEventData eventData)
  22. {
  23. Disconnect(eventData.connectionId);
  24. }
  25. public void OnDisconnect(SignalingEventData eventData)
  26. {
  27. Disconnect(eventData.connectionId);
  28. }
  29. private void Disconnect(string connectionId)
  30. {
  31. if (!connectionIds.Contains(connectionId))
  32. return;
  33. connectionIds.Remove(connectionId);
  34. foreach (var sender in streams.OfType<IStreamSender>())
  35. {
  36. RemoveSender(connectionId, sender);
  37. }
  38. foreach (var receiver in streams.OfType<IStreamReceiver>())
  39. {
  40. RemoveReceiver(connectionId, receiver);
  41. }
  42. foreach (var channel in streams.OfType<IDataChannel>())
  43. {
  44. RemoveChannel(connectionId, channel);
  45. }
  46. }
  47. public void OnAddReceiver(SignalingEventData data)
  48. {
  49. var track = data.transceiver.Receiver.Track;
  50. IStreamReceiver receiver = GetReceiver(track.Kind);
  51. SetReceiver(data.connectionId, receiver, data.transceiver);
  52. }
  53. public void OnOffer(SignalingEventData data)
  54. {
  55. if (connectionIds.Contains(data.connectionId))
  56. {
  57. Debug.Log($"Already answered this connectionId : {data.connectionId}");
  58. return;
  59. }
  60. connectionIds.Add(data.connectionId);
  61. foreach (var source in streams.OfType<IStreamSender>())
  62. {
  63. AddSender(data.connectionId, source);
  64. }
  65. foreach (var channel in streams.OfType<IDataChannel>().Where(c => c.IsLocal))
  66. {
  67. AddChannel(data.connectionId, channel);
  68. }
  69. SendAnswer(data.connectionId);
  70. }
  71. public void OnAddChannel(SignalingEventData data)
  72. {
  73. var channel = streams.OfType<IDataChannel>().
  74. FirstOrDefault(r => !r.IsConnected && !r.IsLocal);
  75. channel?.SetChannel(data.connectionId, data.channel);
  76. }
  77. IStreamReceiver GetReceiver(WebRTC.TrackKind kind)
  78. {
  79. if (kind == WebRTC.TrackKind.Audio)
  80. return streams.OfType<AudioStreamReceiver>().First();
  81. if (kind == WebRTC.TrackKind.Video)
  82. return streams.OfType<VideoStreamReceiver>().First();
  83. throw new System.ArgumentException();
  84. }
  85. }
  86. }