Files
energy_storage/web/public/codebase/jsPlugin/audioMixer/audioMixer-worker.js
2025-09-11 16:14:55 +08:00

87 lines
3.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
importScripts('AudioAMER.js');
let channelNum = 2; // 通道数需求上只需要2通道不用改
let sampleRate = 32000; // 采样率支持8K/16K/32K/48K
let bitsPerSample = 16; // 采样精度支持16/32
let dataLen = 320; // 一帧数据长度采样点数320个16位采样点即640B支持4/8/10/16/20/24/30/32/40ms
// self.JSAudioCodecModule['onRuntimeInitialized'] = function () {
// JSAudioCodecModule().then(instance => {
// AudioModule = instance;
// });
// postMessage({type: "loaded"});
// };
JSAudioCodecModule().then(instance => {
AudioModule = instance;
postMessage({type: "loaded"});
});
onmessage = function (e) {
let data = e.data;
if ("create" === data.type) {
let size = AudioModule._malloc(4);
let alignment = AudioModule._malloc(4);
if (size === null || alignment === null) {
console.log("inputdata malloc failed!!!");
return -1;
}
channelNum = data.channelNum;
sampleRate = data.sampleRate;
bitsPerSample = data.bitsPerSample;
dataLen = data.dataLen;
let iRet = AudioModule._JSHIK_AMER_GetMemSize(channelNum, sampleRate, bitsPerSample, dataLen, size, alignment);
if (iRet !== 1) {
console.log("_CreatHandle failed!" + iRet);
} else {
let sizeOut = AudioModule.getValue(size, "i32");
let alignmentOut = AudioModule.getValue(alignment, "i32");
iRet = AudioModule._JSHIK_AMER_Create(channelNum, sampleRate, bitsPerSample, dataLen, sizeOut, alignmentOut);
console.log("Create_res:" + iRet);
postMessage({type: "created"});
}
if (size !== null) {
AudioModule._free(size);
size = null;
}
if (alignment !== null) {
AudioModule._free(alignment);
alignment = null;
}
} else if ("inputData" === data.type) {
let inputSize = dataLen * 2;//dataLen为320inputSize应该是 320 * 2 = 640
let pInputData1 = AudioModule._malloc(inputSize);
let pInputData2 = AudioModule._malloc(inputSize);
let pOutputData1 = AudioModule._malloc(inputSize);
let pOutputData2 = AudioModule._malloc(inputSize);
let pOutputData3 = AudioModule._malloc(inputSize);
if (pInputData1 === null || pInputData2 === null || pOutputData1 === null || pOutputData2 === null || pOutputData3 === null) {
console.log("inputdata or outputData malloc failed!!!");
return -1;
}
let inputData1 = new Uint8Array(data.buf1);
let inputData2 = new Uint8Array(data.buf2);
AudioModule.writeArrayToMemory(inputData1, pInputData1);
AudioModule.writeArrayToMemory(inputData2, pInputData2);
inputData1 = null;
inputData2 = null;
// 开始处理
let res = AudioModule._JSHIK_AMER_Process(pInputData1, pInputData2, pOutputData1, pOutputData2, pOutputData3, parseInt(inputSize / 2, 10));
if (res === 1) {
let aOutputData = new Uint8Array(inputSize);
aOutputData.set(AudioModule.HEAPU8.subarray(pOutputData3, pOutputData3 + inputSize)); // 必须取pOutputData3的数据
// postMessage({ type: "outputData", buf: aOutputData}, [aOutputData]);
postMessage({ type: "outputData", dType: 1, buf: aOutputData.buffer}, [aOutputData.buffer]);
}
AudioModule._free(pInputData1);
AudioModule._free(pInputData2);
AudioModule._free(pOutputData1);
AudioModule._free(pOutputData2);
AudioModule._free(pOutputData3);
} else if ("release" === data.type) {
//奇怪,到时和研究院确认一下,库为什么不提供释放资源或者停止的接口??
close();
}
};