fix crash bridge khi đổi SF→VSTi đang play: silence same-plugin theo path MỚI trước assign() (createInstance) — track restore giữ cùng DLL process song song audio loop = 2 threads 1 DLL Nexus crash; không tự mở GUI khi đang play (C++ mute channel tới khi đóng GUI → tắt âm)

This commit is contained in:
2026-08-14 17:08:17 +07:00
parent af59aaf257
commit 2596372ab1
4 changed files with 49 additions and 20 deletions
+7
View File
@@ -86,3 +86,10 @@ chạy từng mục trên máy Windows (hoặc OS native có đủ toolchain),
- ⚠️ Nexus VST3 silent (license). Dùng ACDD demo để chứng minh âm.
- ⚠️ daw_engine.exe serve index.html từ memory lúc start (v=202608121600) dù file trên đĩa đã bump v=202608121700 → restart app mới nhận build mới.
- Ghi chú deploy: copy `app/static/js/app.precompiled.js` + `app/templates/index.html` → `dist/`, `src-tauri/resources/`, `src-tauri/target/release/` (cùng dưới `daw_engine/_internal/app/`), bump `?v=` chống cache.
## Kết quả test THẬT Windows 2026-08-13 (build af59aaf + hotfix SF→VSTi khi play)
- 🐛 **BUG (user báo): auto-restore project → track SF2 đang play → nút Synth đổi SF→VSTi → crash bridge, tắt âm, không play lại được.**
- Nguyên nhân C++: LOAD job (type=2) silence same-plugin channels CHỈ SAU `assign()` — mà `assign()` chứa `createInstance` (loadPlugin) chạy trên worker. Nếu track KHÁC (từ restore) đang giữ CÙNG DLL VST3 với instrument mới → trong lúc createInstance, audio loop vẫn `process()` inst của track đó → 2 threads trong 1 DLL (Nexus) → crash thoát im lặng.
- Fix C++ (`main.cpp` LOAD job): tính `spNew` (channels giữ path mới, lowercase so sánh) TRƯỚC `assign()`, silence chúng cùng `spOld`; restore sau assign dùng `unmute_if_not_closing`. Tách `lower_path_str()` khỏi `lower_plugin_path()`.
- Nguyên nhân "tắt âm + không tải lại được": sau load VST3 OK, JS tự mở native GUI (`openVstGuiRetry`) dù đang play → C++ mute channel tới khi đóng GUI (reloading_=true, note-on drop) → track câm vĩnh viễn giữa lúc play.
- Fix JS (`app.jsx` loadTrackInstrumentToBridge): chỉ tự mở GUI khi `!isPlayingRef.current`; đang play thì chỉ load instrument im lặng, GUI mở qua nút GUI riêng (`ensureAndOpenVstGui`).
- ✅ **Windows verify**: mở project cũ (track SF2 + track VST3), play, đổi track SF2 → VSTi cùng DLL track kia → không crash, âm VSTi mới phát; đổi lại SF2 → play tiếp được. Mở GUI lúc đang play → track mute (trade-off có chủ đích, âm lại sau khi đóng GUI).