From c2ae45284409fb935b6290a360df38ab48776531 Mon Sep 17 00:00:00 2001 From: locphamtran Date: Sun, 16 Aug 2026 07:47:53 +0700 Subject: [PATCH] G2.4: skip redundant LOAD of already-loaded instrument (keep restored preset) --- 20260815-tasks.md | 7 ++++--- install/daw_vst_bridge.exe | Bin 3852800 -> 3852800 bytes native_bridge/src/main.cpp | 10 ++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/20260815-tasks.md b/20260815-tasks.md index 139c186..30f84e9 100644 --- a/20260815-tasks.md +++ b/20260815-tasks.md @@ -153,15 +153,16 @@ Lý do: G2.2 phụ thuộc G2.1 nhưng giá trị thấp hơn G2.3; làm G2.3 s | G2.1 | main.cpp: globals g_stateDirty/g_transportPlaying/g_lastSnapMutex/g_lastSnap, snapshotsEqual (bo playhead); stateFile = SF_STATE_FILE fallback defaultPath; playheadSamples -> std::atomic; saveStateJob (UiThread, skip khi isReloading, chi save khi snapshot doi); TRANSPORT set g_transportPlaying + dirty; cuoi LOAD dirty=true; periodic 2s dirty + debounce 300ms. Vst3Instrument.h: khai bao bankOf/programOf. StateStore.cpp: ensureParentDir() (CreateDirectoryA chain / mkdir) goi dau save(). | Build PASS (daw_vst_bridge.exe). Deploy PASS (PID moi: sonicforge-daw 9876, daw_engine 24632, daw_vst_bridge 7352). Verify live PASS: LOAD Nexus ch5 + PLAY -> bridge_state.json co 7 instrument (ch0-6 frontend da load), playing=true, presetBase64 non-empty (Nexus 3468/3488, EZkeys 24764); STOP -> playing=false. State round-trip test_state_store.cpp PASS. | test script ban dau ky vong dung 1 instrument (frontend da load 7) -> FAIL gia, chuc nang PASS | assert dung so instrument | ✅ (Win xong) | | G2.2 | | | | | ⬜ | | G2.3 | main.cpp: startup restore block (doc SF_STATE_FILE, guard channel trong, post LOAD job tung channel qua uiWorker, assign + loadSerializedState preset / selectProgram bank-program, g_loadMutex serialize, restore transport PLAY + playhead neu state playing). Vst3Instrument: base64Decode + loadSerializedState (parse [4B BE compLen][comp][4B BE ctrlLen][ctrl], goi restoreState). INativeInstrument.h: virtual loadSerializedState no-op. lib.rs: spawn_bridge set env SF_STATE_FILE = %APPDATA%/SonicForgeDAW/state/bridge_state.json. | Build PASS (bridge + cargo check). Deploy PASS. Verify live PASS: LOAD ch5 + PLAY (playhead 5000) -> kill bridge -> respawn -> log "restoring 7 instruments" + "restored ch=0..6" (Nexus + EZkeys) + "restoring transport PLAY playhead=5000" + ch5 preset 3488B giu nguyen; state file playing=true playhead=5000 inst=7; writeIndex advancing (14859->15234). | - | - | ✅ (Win xong) | -| G2.4 | | | | | ⬜ | +| G2.4 | main.cpp: LOAD case double-load guard — skip khi channel da co cung path (lower_plugin_path(ch) == lower_path_str(path)), giu instance + preset da restore khi JS reload sau respawn/bootstrap | Verify live PASS: LOAD lai Nexus ch5 sau respawn -> log "LOAD skip ch=5 (already loaded)", preset ch5 3488B giu nguyen, writeIndex advancing; 15 LOAD skip trong log (JS reload 7ch x2 + test) | Khong can sua JS: loadVstToBridge/loadTrackInstrumentToBridge khong co guard __bridgePlaying (da chay khi PLAY); chi openVstGuiRetry giu guard OPEN_GUI (G0.2, dung) | | ✅ | | G2.5 | | | | | ⬜ | | G2.6 | | | | | ⬜ | ### Nhật ký thực hiện -- **G2.0** (2026-08-16, Windows): tao `native_bridge/include/StateStore.h` + `native_bridge/src/StateStore.cpp` (CRLF, JSON viet tay, atomic write .tmp→rename, escape \ " +- **G2.0** (2026-08-16, Windows): tao `native_bridge/include/StateStore.h` + `native_bridge/src/StateStore.cpp` (CRLF, JSON viet tay, atomic write .tmp→rename, escape \ " , load parser an toan). Them StateStore.cpp vao CMakeLists target daw_vst_bridge. Build bridge PASS. Test round-trip `native_bridge/debug/test_state_store.cpp` PASS (compile cl vcvars64 + chay). Commit `G2.0: StateStore (JSON state file + atomic write)`. - **G2.1** (2026-08-16, Windows): save day du state ra disk. main.cpp: globals + snapshotsEqual + stateFile env fallback + playheadSamples atomic + saveStateJob (UiThread, skip isReloading, chi ghi khi snapshot doi) + hook TRANSPORT/LOAD + periodic 2s dirty debounce 300ms. Them khai bao bankOf/programOf vao Vst3Instrument.h (thieu declaration -> build fail). StateStore.cpp: ensureParentDir() (CreateDirectoryA chain, Linux mkdir) goi dau save() (fix C2001 do heredoc backslash mangle qua script fix_bs.py). Build PASS. Deploy PASS (PID 9876/24632/7352). Verify live PASS: LOAD Nexus ch5 + PLAY -> state file 7 inst + playing=true + presetBase64 day du; STOP -> playing=false. StateStore round-trip test PASS. Commit `G2.1: save full instrument state to disk (path/type/preset/transport)`. -- **G2.3** (2026-08-16, Windows): auto-reload sau respawn. main.cpp: block restore truoc audio loop - doc state file, chi restore channel trong (guard instruments.get(ch)==nullptr), post LOAD job (assign + loadSerializedState / selectProgram) serialize bang g_loadMutex, neu state playing thi set playhead + g_transportPlaying=true + g_stateDirty. Vst3Instrument.cpp: base64Decode (b64val lookup) + loadSerializedState (parse blob, goi restoreState); Vst3Instrument.h + INativeInstrument.h: khai bao. lib.rs: spawn_bridge them env SF_STATE_FILE (fallback StateStore::defaultPath khi khong set). Build PASS (daw_vst_bridge.exe + cargo check). Deploy + verify live PASS: LOAD ch5 + PLAY playhead 5000 -> taskkill bridge -> respawn tu dong -> log restore 7 inst (Nexus ch0-5, EZkeys ch6) + restore transport PLAY playhead=5000 + ch5 preset 3488B giu nguyen; state file playing=true inst=7; writeIndex advancing. Commit `G2.3: auto-reload instruments from state file after bridge respawn`. +- **G2.3** (2026-08-16, Windows): auto-reload sau respawn. +- **G2.4** (2026-08-16, Windows): go double-load khi JS reload sau respawn. main.cpp: them guard dau LOAD case (truoc setReloading) — neu channel da co cung path (so sanh lower_plugin_path(ch) vs lower_path_str(path)) thi log "LOAD skip ch=N (already loaded)" va return, khong assign lai (thay instance se mat preset da restore tu state file). Ly do: JS reconnect/bootstrap reload gui LOAD cung path sau respawn -> truoc day assign() thay instance -> mat preset. Guard PLAY cua G2.4 (cho restore chay khi PLAY) da co san o JS: loadVstToBridge/loadTrackInstrumentToBridge khong co guard __bridgePlaying, chi openVstGuiRetry giu guard OPEN_GUI (G0.2 — defer GUI khi PLAY van dung). Build PASS (daw_vst_bridge.exe) + deploy + verify live PASS: sau respawn, LOAD lai Nexus ch5 -> "LOAD skip ch=5 (already loaded: ...Nexus.vst3)", preset 3488B giu nguyen, writeIndex advancing; tong 15 LOAD skip (JS reload 7ch x2 + test ch5). Commit `G2.4: skip redundant LOAD of already-loaded instrument (keep restored preset)`. main.cpp: block restore truoc audio loop - doc state file, chi restore channel trong (guard instruments.get(ch)==nullptr), post LOAD job (assign + loadSerializedState / selectProgram) serialize bang g_loadMutex, neu state playing thi set playhead + g_transportPlaying=true + g_stateDirty. Vst3Instrument.cpp: base64Decode (b64val lookup) + loadSerializedState (parse blob, goi restoreState); Vst3Instrument.h + INativeInstrument.h: khai bao. lib.rs: spawn_bridge them env SF_STATE_FILE (fallback StateStore::defaultPath khi khong set). Build PASS (daw_vst_bridge.exe + cargo check). Deploy + verify live PASS: LOAD ch5 + PLAY playhead 5000 -> taskkill bridge -> respawn tu dong -> log restore 7 inst (Nexus ch0-5, EZkeys ch6) + restore transport PLAY playhead=5000 + ch5 preset 3488B giu nguyen; state file playing=true inst=7; writeIndex advancing. Commit `G2.3: auto-reload instruments from state file after bridge respawn`. --- diff --git a/install/daw_vst_bridge.exe b/install/daw_vst_bridge.exe index 4990e7ab1260c5780da7953658c77c09e53b6e72..5ea26e4bccb704204b441a2ce68327cdf5db0c43 100644 GIT binary patch delta 20152 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 delta 18905 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