57 lines
3.0 KiB
Markdown
57 lines
3.0 KiB
Markdown
# 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.
|