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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user