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...");
var TOTAL_MEMORY = 256 * 1024 * 1024;
_fluidModule = await window.__FluidSynthModuleFactory({
locateFile: function (path) {
if (path.endsWith('.wasm')) {
return window.__FluidSynthLocateWasm ? window.__FluidSynthLocateWasm() : path;
}
return path;
}
},
TOTAL_MEMORY: TOTAL_MEMORY
});
if (!_fluidModule || !_fluidModule._new_fluid_settings) {
@@ -135,12 +137,31 @@
buf = await resp.arrayBuffer();
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));
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);
if (sfHandle === -1) {
console.error("[SonicSF] FluidSynth failed to parse:", sfId);
return false;
var errPtr = _fluidModule._fluid_synth_error(_synthPtr);
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);
_currentSfId = sfId;