SingleConnection.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. namespace Unity.RenderStreaming
  5. {
  6. public class SingleConnection : SignalingHandlerBase,
  7. ICreatedConnectionHandler, IDeletedConnectionHandler,
  8. IAddReceiverHandler, IOfferHandler, IAddChannelHandler
  9. {
  10. [SerializeField] private List<Component> streams = new List<Component>();
  11. private string connectionId;
  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 override void CreateConnection(string connectionId)
  22. {
  23. this.connectionId = connectionId;
  24. base.CreateConnection(connectionId);
  25. }
  26. public override void DeleteConnection(string connectionId)
  27. {
  28. if (this.connectionId != connectionId)
  29. return;
  30. Disconnect(connectionId);
  31. base.DeleteConnection(connectionId);
  32. this.connectionId = null;
  33. }
  34. public void OnCreatedConnection(SignalingEventData data)
  35. {
  36. if (data.connectionId != connectionId)
  37. return;
  38. foreach (var sender in streams.OfType<IStreamSender>())
  39. {
  40. AddSender(data.connectionId, sender);
  41. }
  42. foreach (var channel in streams.OfType<IDataChannel>().Where(c => c.IsLocal))
  43. {
  44. AddChannel(connectionId, channel);
  45. }
  46. }
  47. public void OnDeletedConnection(SignalingEventData data)
  48. {
  49. if (data.connectionId != connectionId)
  50. return;
  51. Disconnect(connectionId);
  52. connectionId = null;
  53. }
  54. private void Disconnect(string connectionId)
  55. {
  56. foreach (var sender in streams.OfType<IStreamSender>())
  57. {
  58. RemoveSender(connectionId, sender);
  59. }
  60. foreach (var receiver in streams.OfType<IStreamReceiver>())
  61. {
  62. RemoveReceiver(connectionId, receiver);
  63. }
  64. foreach (var channel in streams.OfType<IDataChannel>())
  65. {
  66. RemoveChannel(connectionId, channel);
  67. }
  68. }
  69. public void OnOffer(SignalingEventData data)
  70. {
  71. if (data.connectionId != connectionId)
  72. return;
  73. SendAnswer(data.connectionId);
  74. }
  75. public void OnAddReceiver(SignalingEventData data)
  76. {
  77. if (data.connectionId != connectionId)
  78. return;
  79. var track = data.transceiver.Receiver.Track;
  80. IStreamReceiver receiver = GetReceiver(track.Kind);
  81. SetReceiver(data.connectionId, receiver, data.transceiver);
  82. }
  83. public void OnAddChannel(SignalingEventData data)
  84. {
  85. if (data.connectionId != connectionId)
  86. return;
  87. var channel = streams.OfType<IDataChannel>().FirstOrDefault(r => !r.IsConnected && !r.IsLocal);
  88. channel?.SetChannel(connectionId, data.channel);
  89. }
  90. IStreamReceiver GetReceiver(WebRTC.TrackKind kind)
  91. {
  92. if (kind == WebRTC.TrackKind.Audio)
  93. return streams.OfType<AudioStreamReceiver>().First();
  94. if (kind == WebRTC.TrackKind.Video)
  95. return streams.OfType<VideoStreamReceiver>().First();
  96. throw new System.ArgumentException();
  97. }
  98. }
  99. }