fix: lag khi ARM sau reload + câm sau vài lần nhấn MIDI - dedup loadSoundFont (1 font=1 sfload, tránh cạn heap 256MB) + preload instrument khi mở/khôi phục dự án

This commit is contained in:
2026-08-03 10:43:26 +07:00
parent 0dc95386f2
commit 25471e6ea5
5 changed files with 45 additions and 5 deletions
+15 -1
View File
@@ -23,6 +23,8 @@
let _activeOscillators = {};
let _gainNode = null;
let _scheduledNotes = [];
let _loadPromises = {};
let _sfloadSeq = 0;
const getCtx = function () {
if (_audioCtx) {
@@ -186,7 +188,7 @@
},
_tryLoadSFL: function (buf, ext) {
var fname = '/' + ext + '_' + Date.now();
var fname = '/' + ext + '_' + (++_sfloadSeq) + '_' + Date.now();
try { _fluidModule.FS.unlink(fname); } catch (e) {}
_fluidModule.FS.writeFile(fname, new Uint8Array(buf));
var cPath = this._allocCStr(fname);
@@ -203,6 +205,18 @@
_currentSfId = sfId;
return true;
}
// Deduplicate concurrent loads: rapid key presses (or several armed
// tracks) all call loadSoundFont for the same font before the first
// load resolves. Without this, the same soundfont is sfload'd several
// times (handles 1,2,3,4…) — wasting the 256MB WASM heap and stalling
// notes until each load finishes (audible lag, then silence).
if (!_loadPromises[sfId]) {
_loadPromises[sfId] = this._doLoadSoundFont(sfId);
}
return _loadPromises[sfId];
},
_doLoadSoundFont: async function (sfId) {
try {
var cache = window.SonicSFStorage;
var buf = cache ? await cache.getBuffer(sfId) : null;