V45.12: fix SF preset wrong sau reopen (race C++ restore async ghi de program JS vua gui) - retry FORCE CC0/CC32/PROGRAM sau 1.5s/4s/8s qua cua so restore, bo dedupe v=202608311035

This commit is contained in:
2026-08-31 10:35:59 +07:00
parent f6104a43d5
commit 845823a9df
3 changed files with 19 additions and 7 deletions
+10 -2
View File
@@ -73,7 +73,7 @@ const resolveTrackInstrumentCtx = (track, tracks) => {
// note; reset khi load instrument mới). Dùng chung mọi đường: timeline,
// preview, keybed. Trước đây bank hardcode 0 + preview/keybed KHÔNG gửi
// program change → SF2 preset ở bank≠0 ra piano sai.
window.__ensureBridgeProgram = (trkId, program, synthEngine) => {
window.__ensureBridgeProgram = (trkId, program, synthEngine, force) => {
try {
if (!window.SonicMidiRouter || !window.SonicMidiRouter.isBridgeActive()) return;
const _bank = synthEngine && synthEngine.soundfont_bank !== undefined ? synthEngine.soundfont_bank : 0;
@@ -83,7 +83,7 @@ window.__ensureBridgeProgram = (trkId, program, synthEngine) => {
if (_prog === undefined || _prog === null) return;
const _key = trkId + ':' + _bank + ':' + _prog;
const _lp = window.__bridgeLastProgram || (window.__bridgeLastProgram = {});
if (_lp[_key]) return;
if (!force && _lp[_key]) return;
_lp[_key] = true;
const _isPerc = _bank === 128;
window.SonicMidiRouter.pushEvent({ cmd: 'CC', channel: trkId, pitch: 0, velocity: 0, data2: (_bank >> 7) & 0x7F, percussion: _isPerc });
@@ -7576,6 +7576,14 @@ const preloadTrackInstruments = async (tracks) => {
// __ensureBridgeProgram falls back to synth_engine.soundfont_program.
if (typeof inst === 'string' && inst.startsWith('sf_')) {
try { if (window.__ensureBridgeProgram) window.__ensureBridgeProgram(t.id || t.trackId, undefined, t.synth_engine); } catch (e) {}
// V45.12: C++ restore (bridge_state.json) chạy ASYNC sau preload —
// assign() + selectProgram(bank/program CŨ) ghi đè program JS vừa
// gửi (race startup). Retry FORCE (bỏ dedupe) sau 1.5s/4s/8s để qua
// cửa sổ restore, không spam mỗi note.
if (t.synth_engine && t.synth_engine.soundfont_program !== undefined) {
const _fire = () => { try { if (window.__ensureBridgeProgram) window.__ensureBridgeProgram(t.id || t.trackId, undefined, t.synth_engine, true); } catch (e) {} };
[1500, 4000, 8000].forEach(ms => setTimeout(_fire, ms));
}
}
}
}