fix: bắt lỗi _fluid_synth_sfload + fallback SF2 + tăng WASM memory

- Gọi _fluid_synth_error để lấy error message từ C engine
- Fallback từ .sf3 → .sf2 nếu sfload thất bại
- TOTAL_MEMORY=256MB cho SoundFont 11MB
- unlink file cũ trước writeFile tránh MEMFS conflict
- Log MEMFS stat để debug
This commit is contained in:
2026-07-27 14:51:39 +07:00
parent e801023beb
commit 6fe0cd8d61
+25 -4
View File
@@ -73,13 +73,15 @@
} }
console.log("[SonicSF] Initializing FluidSynth WASM Engine..."); console.log("[SonicSF] Initializing FluidSynth WASM Engine...");
var TOTAL_MEMORY = 256 * 1024 * 1024;
_fluidModule = await window.__FluidSynthModuleFactory({ _fluidModule = await window.__FluidSynthModuleFactory({
locateFile: function (path) { locateFile: function (path) {
if (path.endsWith('.wasm')) { if (path.endsWith('.wasm')) {
return window.__FluidSynthLocateWasm ? window.__FluidSynthLocateWasm() : path; return window.__FluidSynthLocateWasm ? window.__FluidSynthLocateWasm() : path;
} }
return path; return path;
} },
TOTAL_MEMORY: TOTAL_MEMORY
}); });
if (!_fluidModule || !_fluidModule._new_fluid_settings) { if (!_fluidModule || !_fluidModule._new_fluid_settings) {
@@ -135,12 +137,31 @@
buf = await resp.arrayBuffer(); buf = await resp.arrayBuffer();
if (cache) await cache.saveBuffer(sfId, buf); if (cache) await cache.saveBuffer(sfId, buf);
} }
var virtualPath = '/soundfonts/' + sfId + '.sf3'; var ext = '.sf3';
var virtualPath = '/soundfonts/' + sfId + ext;
console.log("[SonicSF] Writing to MEMFS:", virtualPath, (buf.byteLength / 1024 / 1024).toFixed(2) + 'MB');
try { _fluidModule.FS.unlink(virtualPath); } catch (e) {}
_fluidModule.FS.writeFile(virtualPath, new Uint8Array(buf)); _fluidModule.FS.writeFile(virtualPath, new Uint8Array(buf));
var fsSize = 0;
try { fsSize = _fluidModule.FS.stat(virtualPath).size; } catch (e) {}
console.log("[SonicSF] MEMFS stat:", fsSize, "bytes");
var sfHandle = _fluidModule._fluid_synth_sfload(_synthPtr, virtualPath, 1); var sfHandle = _fluidModule._fluid_synth_sfload(_synthPtr, virtualPath, 1);
if (sfHandle === -1) { if (sfHandle === -1) {
console.error("[SonicSF] FluidSynth failed to parse:", sfId); var errPtr = _fluidModule._fluid_synth_error(_synthPtr);
return false; var errMsg = errPtr ? _fluidModule.UTF8ToString(errPtr) : "unknown";
console.warn("[SonicSF] sfload failed for", sfId, "as", ext, "error:", errMsg);
try { _fluidModule.FS.unlink(virtualPath); } catch (e) {}
ext = '.sf2';
virtualPath = '/soundfonts/' + sfId + ext;
_fluidModule.FS.writeFile(virtualPath, new Uint8Array(buf));
sfHandle = _fluidModule._fluid_synth_sfload(_synthPtr, virtualPath, 1);
if (sfHandle === -1) {
var errPtr2 = _fluidModule._fluid_synth_error(_synthPtr);
var errMsg2 = errPtr2 ? _fluidModule.UTF8ToString(errPtr2) : "unknown";
console.error("[SonicSF] FluidSynth failed to parse", sfId, "even as .sf2:", errMsg2);
return false;
}
console.log("[SonicSF] Loaded", sfId, "as .sf2 fallback, handle:", sfHandle);
} }
_sfHandleMap.set(sfId, sfHandle); _sfHandleMap.set(sfId, sfHandle);
_currentSfId = sfId; _currentSfId = sfId;