VoiceMeeting.razor 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. @using System.Text
  2. @using System.Net.WebSockets
  3. @inject HttpClient http
  4. @code {
  5. private bool ready = false;
  6. private List<string> logs = new();
  7. private ClientWebSocket sck;
  8. }
  9. <div class="container">
  10. <h2>Simple Web Chat(Voice meeting)</h2>
  11. @if (!ready)
  12. {
  13. <div class="row m-2">
  14. <div class="col-12">
  15. <button @onclick="@Init" class="btn btn-primary">Open Microphone and Connect</button>
  16. </div>
  17. </div>
  18. }
  19. else
  20. {
  21. <div class="row">
  22. <div class="col-12">
  23. @foreach (var s in logs)
  24. {
  25. <div>
  26. <pre>@s</pre>
  27. </div>
  28. }
  29. </div>
  30. </div>
  31. }
  32. </div>
  33. @code {
  34. private WebSocket socket;
  35. private async Task Init()
  36. {
  37. ready = await AudioCaptureModule.Init();
  38. if (ready)
  39. {
  40. AudioCaptureModule.ChunkArrive += SendChunk;
  41. await Go();
  42. }
  43. }
  44. private void SendChunk(byte[] obj)
  45. {
  46. socket?.SendAsync(obj, WebSocketMessageType.Binary, true, default);
  47. }
  48. private async Task Go()
  49. {
  50. if (socket != null)
  51. {
  52. try
  53. {
  54. await socket.CloseAsync(WebSocketCloseStatus.Empty, "Brrrrrr", default);
  55. }
  56. catch
  57. {
  58. //FUCK ERR
  59. }
  60. try
  61. {
  62. socket.Dispose();
  63. }
  64. catch
  65. {
  66. //FUCK ERR
  67. }
  68. logs.Insert(0, "Disconnected");
  69. StateHasChanged();
  70. socket = null;
  71. }
  72. sck = new ClientWebSocket();
  73. sck.Options.AddSubProtocol("svmp");
  74. var b = http.BaseAddress;
  75. try
  76. {
  77. await sck.ConnectAsync(new Uri($"{(b.Scheme == "https" ? "wss" : "ws")}://{b.Host}:{b.Port}/connect/voice/meeting"), default);
  78. logs.Insert(0, "Connected");
  79. StateHasChanged();
  80. socket = sck;
  81. await AudioCaptureModule.Start();
  82. while (true)
  83. {
  84. var buf = new Byte[15384];
  85. var r = await sck.ReceiveAsync(buf, default);
  86. if (r.Count == 0)
  87. {
  88. logs.Insert(0, "Disconnected");
  89. StateHasChanged();
  90. break;
  91. }
  92. if (r.MessageType == WebSocketMessageType.Text)
  93. {
  94. logs.Insert(0, Encoding.UTF8.GetString(buf, 0, r.Count));
  95. StateHasChanged();
  96. }
  97. else
  98. {
  99. var chunk = new byte[r.Count];
  100. Array.Copy(buf, 0, chunk, 0, chunk.Length);
  101. await AudioPlaybackModule.PlayChunk(chunk);
  102. }
  103. }
  104. }
  105. catch (Exception e)
  106. {
  107. logs.Insert(0, e.ToString());
  108. StateHasChanged();
  109. }
  110. }
  111. }