audioMixer-worker.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. importScripts('AudioAMER.js');
  2. let channelNum = 2; // 通道数(需求上只需要2通道,不用改)
  3. let sampleRate = 32000; // 采样率,支持8K/16K/32K/48K
  4. let bitsPerSample = 16; // 采样精度,支持16/32
  5. let dataLen = 320; // 一帧数据长度(采样点数),320个16位采样点即640B,支持4/8/10/16/20/24/30/32/40ms
  6. // self.JSAudioCodecModule['onRuntimeInitialized'] = function () {
  7. // JSAudioCodecModule().then(instance => {
  8. // AudioModule = instance;
  9. // });
  10. // postMessage({type: "loaded"});
  11. // };
  12. JSAudioCodecModule().then(instance => {
  13. AudioModule = instance;
  14. postMessage({type: "loaded"});
  15. });
  16. onmessage = function (e) {
  17. let data = e.data;
  18. if ("create" === data.type) {
  19. let size = AudioModule._malloc(4);
  20. let alignment = AudioModule._malloc(4);
  21. if (size === null || alignment === null) {
  22. console.log("inputdata malloc failed!!!");
  23. return -1;
  24. }
  25. channelNum = data.channelNum;
  26. sampleRate = data.sampleRate;
  27. bitsPerSample = data.bitsPerSample;
  28. dataLen = data.dataLen;
  29. let iRet = AudioModule._JSHIK_AMER_GetMemSize(channelNum, sampleRate, bitsPerSample, dataLen, size, alignment);
  30. if (iRet !== 1) {
  31. console.log("_CreatHandle failed!" + iRet);
  32. } else {
  33. let sizeOut = AudioModule.getValue(size, "i32");
  34. let alignmentOut = AudioModule.getValue(alignment, "i32");
  35. iRet = AudioModule._JSHIK_AMER_Create(channelNum, sampleRate, bitsPerSample, dataLen, sizeOut, alignmentOut);
  36. console.log("Create_res:" + iRet);
  37. postMessage({type: "created"});
  38. }
  39. if (size !== null) {
  40. AudioModule._free(size);
  41. size = null;
  42. }
  43. if (alignment !== null) {
  44. AudioModule._free(alignment);
  45. alignment = null;
  46. }
  47. } else if ("inputData" === data.type) {
  48. let inputSize = dataLen * 2;//dataLen为320,inputSize应该是 320 * 2 = 640
  49. let pInputData1 = AudioModule._malloc(inputSize);
  50. let pInputData2 = AudioModule._malloc(inputSize);
  51. let pOutputData1 = AudioModule._malloc(inputSize);
  52. let pOutputData2 = AudioModule._malloc(inputSize);
  53. let pOutputData3 = AudioModule._malloc(inputSize);
  54. if (pInputData1 === null || pInputData2 === null || pOutputData1 === null || pOutputData2 === null || pOutputData3 === null) {
  55. console.log("inputdata or outputData malloc failed!!!");
  56. return -1;
  57. }
  58. let inputData1 = new Uint8Array(data.buf1);
  59. let inputData2 = new Uint8Array(data.buf2);
  60. AudioModule.writeArrayToMemory(inputData1, pInputData1);
  61. AudioModule.writeArrayToMemory(inputData2, pInputData2);
  62. inputData1 = null;
  63. inputData2 = null;
  64. // 开始处理
  65. let res = AudioModule._JSHIK_AMER_Process(pInputData1, pInputData2, pOutputData1, pOutputData2, pOutputData3, parseInt(inputSize / 2, 10));
  66. if (res === 1) {
  67. let aOutputData = new Uint8Array(inputSize);
  68. aOutputData.set(AudioModule.HEAPU8.subarray(pOutputData3, pOutputData3 + inputSize)); // 必须取pOutputData3的数据
  69. // postMessage({ type: "outputData", buf: aOutputData}, [aOutputData]);
  70. postMessage({ type: "outputData", dType: 1, buf: aOutputData.buffer}, [aOutputData.buffer]);
  71. }
  72. AudioModule._free(pInputData1);
  73. AudioModule._free(pInputData2);
  74. AudioModule._free(pOutputData1);
  75. AudioModule._free(pOutputData2);
  76. AudioModule._free(pOutputData3);
  77. } else if ("release" === data.type) {
  78. //奇怪,到时和研究院确认一下,库为什么不提供释放资源或者停止的接口??
  79. close();
  80. }
  81. };