- GUI process peek ring SHM đầu vào (không consume, không tranh chấp RealtimeFxLoop)
- gọi fx->processAudio() trên instance GUI để meter/UI plugin chuyển động theo âm thật
- performEdit forward sang controller -> meter điều khiển bởi param cũng cập nhật
- bridge /shm: frontend đẩy tên session live vào mỗi GUI đang mở (start/stop/open)
- tests: 127 passed
- Bỏ push setFxChain xuống native bridge (T2.4) — SHM fxRt loop (fx_vst_bridge
--realtime-fx) là nơi xử lý live master mix duy nhất; trước đây MIDI/VSTi
instrument bị xử lý 2 lần (native bridge + SHM loop) → over-process,
âm bể/crackle. setFxChain vẫn dùng khi Export/Offline render.
- closeMasterGui/closeFxGui: POST /close (kill process) thay vì /hide —
không còn cửa sổ floating always-on-top lơ lửng, tắt được dứt điểm.
- openFxGui already_running kèm embed_url → mở lại embed panel thay vì chỉ toast.
- open_fx_gui (plugins.py): spawn fx-gui với SF_PARENT_PID=<engine pid>.
- RenderFxJob.cpp: watchdog thread trong run_open_fx_gui/run_fx_gui_server —
engine chết → WM_CLOSE, GUI process tự thoát, không để lại cửa sổ mồ côi.
- App default + 2 fallback (ProfileModal, load project): eqActive/
imagerActive/maximizerActive = false (truoc day chain rong nhung cac
flag van true -> Imager+Maximizer van xu ly am mac du MASTERING PANEL
trong)
- applyMasteringSettings doc flag truc tiep, khong check chain — user
phai them module trong MASTERING PANEL moi bat built-in processing
- bump cache-bust app.precompiled.js -> 202608212330
- masteringSettings effect goi fxRtStart() khong dieu kien: early-return
khi active + cung chainKey, stop+start lai khi chain doi (insert/remove/
bypass/reorder VST trong MASTER FX CHAIN) — truoc day nhanh chainKey
chet vi branch chi chay khi !fxRt.active
- test list_scan_all: path plugin phai ton tai tren dia (loc entry chet
truoc cache); dung _scan_json helper voi file that trong tmp_path
- bump cache-bust app.precompiled.js -> 202608212300
MASTERING PANEL auto-seeded 3 modules (Dynamic EQ/Imager/Maximizer) and
removeChainModule re-added them when the chain hit zero. Chain now starts
empty everywhere (init, restore fallback, migration, graph fallback) and
can be removed down to empty; activeModule guards empty chain (null).
Cache-bust precompiled.js ?v= bump.
- vst_engine: list_scan_all cache co TTL 300s (FX_SCAN_TTL) + chi cache khi
find_fx_bridge_exe() co exe (thieu bridge -> tra [] NHUNG khong cache de
lan sau thu lai) — truoc day ket [] vi mui gio, MASTERING PANEL rong.
- vst_engine: them invalidate_fx_scan() clear cache scan VST.
- plugins.py: POST /scan (Plugin Manager Scan) goi _invalidate_fx_scan_cache()
-> MASTERING PANEL lan mo ke tiep quet lai voi dirs moi; response them
fx_cache_invalidated.
- app.jsx: MasteringModal/FXRackModal load listFx() lai moi lan mo modal
(deps [isOpen]/[track.id]) + loading state; VstPluginPicker nhan prop
loading -> hien 'Dang quet VST FX...' thay vi 'Khong co VST FX'.
- precompiled rebuild (LF) + index.html ?v=202608220330; dist sync.
- tests: +4 test cache TTL/invalidate/no-bridge (TestFxScanCache).
Qin_RV_x64.dll (Kong Audio) crashed with SEH 0xc0000005 in Bridger64.dll
using the stale install binary (pre-ABI-fix). Copy native_bridge build
Release binary into install/ so the packaged app runs the fixed host.
Also open the native GUI after loading a VST2 instrument (previously
VST3-only), so Qin_RV's editor (Qin_VST_Window via auxhost.exe) shows
automatically on track load.
- RenderFxJob: offscreen fx-gui window now WS_POPUP (borderless) so
GetWindowRect == client rect; anchored placement over the embed panel is
exact. WS_OVERLAPPEDWINDOW put the client ~31px lower/right -> cursor
jumped on hover and clicks hit the webview (relay rejected).
- AdjustWindowRect sizes to the window's own style (no caption for POPUP).
- FxGuiServer: mousemove only SetCursorPos while dragging (buttons!=0);
hover no longer teleports the cursor.
- FxGuiServer /show: skip SetWindowPos/resize when rect unchanged (frontend
now re-POSTs /show every ~500ms to re-anchor on scroll/resize).
- app.jsx VstGuiEmbed: drop shownRef one-shot; re-POST /show each refresh.
- Rebuilt bridge (6 locations) + Tauri release (embedded sidecar) + v=202608190002.
bridge_status (Rust binary cu, chua co V10 field loaded_channels) -> queryStatus
fallback khong co loaded_channels -> lc undefined -> silent return 6626 lam GUI
chet im lang o click 2. Bo silent return: mo GUI truc tiep tren bch, an toan vi
C++ handleOpenGui DEFER khi channel chua co instrument.