svc-module.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. const { getAssemblyExports } = await globalThis.getDotnetRuntime(0);
  2. var nameSpace = (await getAssemblyExports("SimpleVoiceChat.BlazorWasm.dll")).SimpleVoiceChat.BlazorWasm;
  3. var DotNetInterop = nameSpace.SvcModule;
  4. var isRunning = false;
  5. var stream;
  6. var recorder;
  7. export async function init() {
  8. if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia)
  9. stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  10. else if (navigator.webkitGetUserMedia)
  11. stream = await navigator.webkitGetUserMedia({ audio: true });
  12. else throw "failure to getUserMedia";
  13. if (stream) {
  14. recorder = new MediaRecorder(stream, {
  15. audioBitsPerSecond: 64000,
  16. mimeType: 'audio/webm;codecs=OPUS'
  17. });
  18. recorder.ondataavailable = async (r) => {
  19. DotNetInterop.JsFeedChunk(new Uint8Array(await r.data.arrayBuffer()));
  20. };
  21. recorder.onstop = () => {
  22. if (isRunning) {
  23. recorder.start();
  24. setTimeout(() => {
  25. if (isRunning) recorder.stop();
  26. }, 1000);
  27. }
  28. };
  29. }
  30. return !!stream;
  31. }
  32. export async function start() {
  33. isRunning = true;
  34. recorder.start();
  35. setTimeout(() => {
  36. if (isRunning) recorder.stop();
  37. }, 1000);
  38. }
  39. export async function stop() {
  40. isRunning = false;
  41. recorder.stop();
  42. }
  43. export async function createBlobUrl(bytes) {
  44. return URL.createObjectURL(new Blob([bytes]));
  45. }