# G1 — JUCE engine SHM chain rỗng POC (kết quả) Ngày: 2026-08-28. Commit: `9c0d35d`. Plan: `JUCE_LATENCY_PLAN.md` G1. ## Nội dung - Submodule `native_bridge/JUCE` = tag `8.0.8`... thực tế tag `8.0.7` (shallow, `.gitmodules` branch=8.0.7) — khớp pattern vst3sdk sẵn có. - Tách SHM dùng chung: `native_bridge/include/FxShm.h` (namespace `fxshm`, `ShmView`/`openShm`/`closeShm` — Windows FileMapping); `RealtimeFxLoop.cpp` chuyển sang dùng chung (không đổi hành vi bridge cũ). - Project mới `native_bridge/juce_fx/`: `juce_fx_bridge` dùng `juce::AudioProcessorGraph`, chain rỗng = input node → output node (passthrough). `prepare(sr, block)` → prepareToPlay(block*4) vì batch tối đa 4 block; `process(inL, inR, n)` copy vào `AudioBuffer` → `graph.processBlock` → copy về in-place. `latencySamples()` = `graph.getLatencySamples()`. - Loop C++: batching 4 block, out-ring backpressure, heartbeat 100ms, `timeBeginPeriod(1)` + ABOVE_NORMAL, log `[JuceFxLoop]/[JuceFxPerf]`; validate header mỗi iteration — sampleRate/blockSize đổi → re-prepare + report latency qua lat ring; job `fx_chain` BỎ QUA (G1 chain rỗng). - Python: `app/core/fx_realtime.py` `_spawn()` — env `SF_JUCE_FX_BRIDGE_PATH` chọn bridge JUCE (`--juce-fx`); mặc định giữ nguyên `fx_vst_bridge --realtime-fx`. Exe copy: `src-tauri/binaries/juce_fx_bridge-x86_64-pc-windows-msvc.exe`. ## Kết quả probe Probe `native_bridge/debug/g0_latency_probe.py`, 10k block/config, pipeline thật Python→SHM→juce_fx_bridge→SHM, `timeBeginPeriod(1)`, env `SF_JUCE_FX_BRIDGE_PATH` trỏ exe JUCE. (3 config trong probe đều chạy qua JUCE bridge; G1 chain rỗng nên pureComp/Ozone cũng passthrough — kiểm chứng không crash, không lag.) | Config | mean ms | σ | p50 | p99 | max | recv/sent | pump_rate | drained | latency | |---|---|---|---|---|---|---|---|---|---| | empty | 21.670 | 0.636 | 21.649 | 22.087 | 24.031 | 10000/10000 | 184.9 | ✅ | {0:0} | | pureComp | 21.686 | 0.168 | 21.656 | 22.073 | 23.399 | 10000/10000 | 184.9 | ✅ | {0:0} | | Ozone 11 | 21.674 | 0.157 | 21.640 | 22.049 | 22.277 | 10000/10000 | 185.0 | ✅ | {0:0} | So sánh baseline G0 (empty): mean 21.67ms — không lag thêm, không crackle (drained=True, recv=sent, interarrival mean ~0.07ms). Log bridge: `[JuceFxLoop] prepared sr=48000 block=256 latency=0` → ready → exit. ## G1 done-when - ✅ `--juce-fx` chạy với chain rỗng - ✅ Python `fx_realtime.py` chơi qua nó bằng path cũ (env opt-in, mặc định cũ không đổi) — regression pass ## Ghi chú - Lỗi build gặp phải: `NodeAndChannel`/`Connection` không aggregate-init được trên MSVC 2019 — phải gán field từng cái; `addNode` trả `Node::Ptr` → lấy `->nodeID` (không gán Ptr vào `NodeID`). - JUCE modules build lần đầu chậm (~34s config); `build_juce/` đã gitignore. - `[JuceFxPerf]` heartbeat không xuất hiện trong probe ngắn (chạy <100ms); probe chỉ grep tag cũ `[FxRTPerf]` — không phải lỗi.