implementing aec

This commit is contained in:
samtiz 2025-07-08 11:58:26 +09:00
parent 3f116b43bf
commit da6602ef66
5 changed files with 69 additions and 3 deletions

1
aec Submodule

@ -0,0 +1 @@
Subproject commit 66c447ba544dfe8e3bb4091fda2961a11066910b

View File

@ -10,7 +10,7 @@
"package": "npm run build:renderer && electron-forge package", "package": "npm run build:renderer && electron-forge package",
"make": "npm run build:renderer && electron-forge make", "make": "npm run build:renderer && electron-forge make",
"build": "npm run build:all && electron-builder --config electron-builder.yml --publish never", "build": "npm run build:all && electron-builder --config electron-builder.yml --publish never",
"build:win": "npm run build:all && electron-builder --win --x64 --publish never", "build:win": "npm run build:all && electron-builder --win --x64 --publish never",
"publish": "npm run build:all && electron-builder --config electron-builder.yml --publish always", "publish": "npm run build:all && electron-builder --config electron-builder.yml --publish always",
"lint": "eslint --ext .ts,.tsx,.js .", "lint": "eslint --ext .ts,.tsx,.js .",
"postinstall": "electron-builder install-app-deps", "postinstall": "electron-builder install-app-deps",
@ -39,7 +39,6 @@
"better-sqlite3": "^9.4.3", "better-sqlite3": "^9.4.3",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^17.0.0", "dotenv": "^17.0.0",
"electron-squirrel-startup": "^1.0.1", "electron-squirrel-startup": "^1.0.1",
"electron-store": "^8.2.0", "electron-store": "^8.2.0",
"electron-updater": "^6.6.2", "electron-updater": "^6.6.2",
@ -74,4 +73,4 @@
"optionalDependencies": { "optionalDependencies": {
"electron-liquid-glass": "^1.0.1" "electron-liquid-glass": "^1.0.1"
} }
} }

20
src/assets/aec.js Normal file

File diff suppressed because one or more lines are too long

BIN
src/assets/aec.wasm Executable file

Binary file not shown.

View File

@ -1,5 +1,33 @@
const { ipcRenderer } = require('electron'); const { ipcRenderer } = require('electron');
const createAecModule = require('../../../assets/aec.js'); // aec.js 위치
let aecWasm; // 전역 캐시
export async function initAec () {
if (aecWasm) return aecWasm; // 이미 초기화됐으면 그대로
// ⬇️ locateFile: aec.js 가 wasm 로드를 시도할 때 호출
aecWasm = await createAecModule({
locateFile (filename) {
// aec.js 는 aec.wasm 한 개만 요청하므로, 주소를 직접 반환
return '../../../assets/' + filename; // ← **브라우저 기준 URL**
// (Electron renderer 에서 file://…/dist/renderer/… 에서 접근)
}
});
// C → JS 래퍼
aecWasm.newPtr = aecWasm.cwrap('AecNew', 'number',
['number','number','number','number']);
aecWasm.cancel = aecWasm.cwrap('AecCancelEcho', null,
['number','number','number','number','number']);
aecWasm.destroy = aecWasm.cwrap('AecDestroy', null, ['number']);
return aecWasm;
}
// 바로 로드-실패 로그를 보기 위해
initAec().catch(console.error);
// --------------------------- // ---------------------------
// Constants & Globals // Constants & Globals
// --------------------------- // ---------------------------
@ -80,6 +108,24 @@ function arrayBufferToBase64(buffer) {
return btoa(binary); return btoa(binary);
} }
function int16PtrFromFloat32(mod, f32) {
const len = f32.length;
const bytes = len * 2;
const ptr = mod._malloc(bytes);
const i16 = new Int16Array(mod.HEAP16.buffer, ptr, len);
for (let i = 0; i < len; ++i) {
const s = Math.max(-1, Math.min(1, f32[i]));
i16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;
}
return { ptr, view: i16 };
}
function float32FromInt16View(i16) {
const out = new Float32Array(i16.length);
for (let i = 0; i < i16.length; ++i) out[i] = i16[i] / 32768;
return out;
}
// --------------------------- // ---------------------------
// Complete SimpleAEC implementation (exact from renderer.js) // Complete SimpleAEC implementation (exact from renderer.js)
// --------------------------- // ---------------------------