Commit Graph

125 Commits

Author SHA1 Message Date
3dtours f793ebce9b fix(bridge): first-paint kick real click — iZotope GUI embed hien thi that 2026-09-02 11:44:16 +07:00
3dtours d068927694 fix(bridge): Ozone FX GUI embed crash license check — sleep truoc attach + retry 5 spawn
Root cause (minidump x3, cung offset iZOzone11Core.dll+0x18f6b92): crash
deterministic 1 instruction - memcmp std::string [rdi+0x100] vs "iLok"
trong license check, doc heap ptr garbage (use-after-free/corrupt trong
iZotope Product Engine license path, flaky theo timing).

Fixes:
- RenderFxJob.cpp: fxGuiLoadAttach giu retry 4 attempt moi instance moi
  (SEH-guarded dispose); them Sleep(2s) giua load va attach cho plugin
  iZotope/Ozone - Product Engine service het race, attempt 1 open ngay
  (E2E: 60-70s -> 10-22s, 8/8 run OK).
- plugins.py: _spawn_fx_gui_embed process-level respawn 3->5 lan + delay
  2s giua respawn (service can thoi gian hoi phuc sau crash); di chuyen
  BELOW_NORMAL/CREATE_NO_WINDOW sang _fx_gui_creationflags(); gui stdout
  bridge qua thread de khong block event loop (asyncio.to_thread).
- main_fx.cpp: FxCrashDumpHandler log MOI exception (khong chi lan dau),
  minidump van 1 lan/process.

Verified: E2E engine-from-source 8/8 run Ozone embed OK; app installed
(thu cai moi installer NSIS): OPEN 49.5s, frames 10/10 jpeg, spawn.log
khong con 0x7E/Fatal Error.
2026-09-02 09:40:17 +07:00
3dtours 4da46d87c8 fix(bridge): skip toàn bộ iZotope trong scan + VST2 load — wrapper 0x7E/FastFail hết dialog 2026-09-01 22:26:40 +07:00
3dtours aaf58db56f fix(bridge): VST2 iZotope wrapper 0x7E — add Cores dirs to PATH; skip Ozone Pro fastfail 2026-09-01 22:07:10 +07:00
3dtours 31f19fa537 bridge: skip Ozone 11 modules (license fastfail c0000409 kills scan/render)
Ozone 11 (iZotope) tu __fastfail FATAL_APP_EXIT khi load — khong bi SEH chan,
giet ca bridge process. Scan -> mat ca dir -> FX list rong; render/realtime ->
crash. Khong load: scan emit UNKNOWN, load tra loi sach. Ozone Pro van OK.
ponytail: SandboxVst3Host (1 module 1 process) khi can Ozone 11.
2026-09-01 20:37:59 +07:00
3dtours 1acb6f23f1 fix(bridge): 0x7E iZotope — append core DLL dirs (Program Files/iZotope/*/Cores) vao PATH truoc Module::create
iZotope VST3 single-file (Ozone 11.vst3) reference core DLL
(iZOzone11Core.dll) dat rieng o C:\Program Files\iZotope\<Product>\Cores,
khong canh .vst3. SetDllDirectoryW chi phu dir canh plugin -> LoadLibraryW
fail ERROR_MOD_NOT_FOUND (0x7E) -> Windows dialog khi app load plugin.
VstDllSearch.h quet cac dir Cores co dinh + append vao PATH (process-global,
bridge load 1 plugin 1 luc). Ap dung ca RenderFxJob (FX chain + scan) va
Vst3Instrument (VSTi).
2026-09-01 18:08:10 +07:00
admin 945e63918d V45.6 fix solo Q3: bo stopAllPlayback+restart 60ms khi solo main-session (track solo giu nguyen tieng, het wobble re-attack); GIU timelinePitchesRef qua stop - kill branch NOTE_OFF tung pitch (Qin im khi solo track khac, truoc day tset=0); C++ allNotesOff sandbox VST2 qua control 7 (child panic local CC64/CC123+128 noteOff) thay 128 note-off flood queue 64-cap (Qin het treo sau STOP); IPC toggleSolo tu applyAllTrackMuteSolo (ref patch + kill); v=202608292138 2026-08-29 21:39:59 +07:00
admin 72ae22f865 V45.5 instrument solo path (Q3 debug): dbg log solo_toggle/solo_apply/solo_kill/solo_guard/play_tracks - lan test toi thay ro trang thai ref + note bi block; C++ [Vst2Sandbox] ON/OFF/CC log trong SandboxVst2Host (Qin chay sandbox, truoc day midi vao Qin hoan toan mu trong bridge.log - chi VST3 log [midi]), v=202608291806 2026-08-29 18:09:16 +07:00
admin f3fd0109a7 V45.2 fix Qin silence (20s audio-thread stall) + SF loop downbeat delay
- SandboxVst2Host::loadSerializedState: queuePreset non-blocking (byte-identical
  echo never matched -> waitApply always burned 20s TIMEOUT on the audio thread;
  VST2 restore runs via runOnMain so every startup silenced ALL audio ~20s = Qin
  'failed that su'). Bridge now holds reloading + defers saveStateJob until the
  child republishes a different chunk (clobber protection, no audio block).
- sf-fx-realtime clear_queue('loop'): truncate old tail to KEEP=4 blocks
  (~21ms) instead of keeping FILL 24 (~128ms) -> wrap downbeat no longer ~110ms
  late; skipFade crossfade masks the truncation jump, seam crossfade recount.
- bump ?v= 202608291721 (app.jsx x2, index.html x2); deploy 3 _internal + dist.
2026-08-29 17:25:32 +07:00
admin 2afa828c8f V44: fix crackle - uu tien audio thread bridge (HIGHEST) + FILL 24 (cushion ~90ms) PDC 7936 2026-08-28 17:22:50 +07:00
admin 9c0d35def4 G1: JUCE engine SHM chain rong POC - probe pass, khong lag them 2026-08-28 12:35:37 +07:00
admin 24109f8bc4 v15b: fix CC7 to VSTi (legacy tag kHostMidiCC+cc + volume-param fallback), CC lane grid + 0/+- labels 2026-08-26 16:45:42 +07:00
admin 2c96a223af feat: CC11 expression automation (spec midi_note_cc11_expression)
- MIDINote schema + expression_curve (position_ratio 0..1, value 0..127)
- Piano roll CC lane mode Expression (CC11): draw/move/del anchors
- Offline: _expression_events grid 64 samples -> job.events -> RenderJob.cpp sample-accurate CC
- Realtime: scheduleNoteExpressionCC11 grid 16ms via bridge pushEvent / SonicSF fallback, epoch-guarded, cleared on stop
- tests/test_cc11_expression.py 6/6 (unit interp/grid/clamp + integration energy follows curve)
- rebuild daw_vst_bridge (narrowing fix) + sync binaries/dist, babel rebuild + sync 5 copies
2026-08-26 11:14:56 +07:00
admin 5b747606c7 Rebrand SonicForge Studio -> ScoreFX Studio: UI names, About logo, favicon + icons for all exe builds 2026-08-24 19:28:22 +07:00
admin 59e4951912 fix(fxrt): toggle VST bypass khong reload plugin - cache instance trong bridge, chain giu slot bypassed, bypass state trong chainKey, poll 100ms + fade-in 512 samples che gap latency 2026-08-24 16:56:10 +07:00
admin 3a3f46b7d3 fix(fxrt): mo GUI VST khong gay crackle - GUI spawn BELOW_NORMAL, mien watchdog khi mo native GUI, realtime loop ABOVE_NORMAL 2026-08-24 16:38:52 +07:00
admin e12a8d754a fix(fxrt): chan out ring overflow trong bridge (backpressure, het pointer collision) 2026-08-24 12:25:14 +07:00
admin 4240f15e30 fix(engine): defer set_param ra worker thread, VST API khong goi tren audio thread 2026-08-24 12:03:05 +07:00
admin 21130858d6 fix(engine): giam jitter bridge timer va fade-out khi transport stall
- RealtimeFxLoop: timeBeginPeriod(1) + sleep_until thay Sleep(1) -> loopMax 32.9->24.8ms
- plugins.py _pump_output: stall-fade 8 block gain 1->0 khi gap > 5.5*block_sec (~29ms),
  burst send, fade-in 0->1 khi resume; poll dung asyncio.to_thread(time.sleep) vi asyncio.sleep
  bi cap 15.6ms tren Win11 (IOCP) du timeBeginPeriod
- fx_realtime.py: stats dem publish/drop/stale/read cho diagnostics
- rebuild bridge binary
2026-08-24 10:40:21 +07:00
admin 10997a65b9 fix(fx-rt): het crackle master FX - limiter attack smooth + crossfade khi bat/tat chain
- NativeInstrumentEngine: kAttack 0.9->0.1 (het zipper khi sum nhieu track)
- app.jsx: crossfade masterFxDryGain/masterFxGain thay hard-rewire graph luc
  activation/deactivation master chain FX; worklet bao 'started' -> ramp dung
  luc; PDC tre sau khi dry silent (tranh gap 80ms)
- sf-fx-realtime.js: fade-in 512 mau luc FILL xong / resume sau underrun
- index.html + addModule: cache-buster v=202608241200
- rebuild app.precompiled.js, copy bundle vao dist/ + src-tauri/resources/
- keo dai fix cac round truoc: FILL 16, FXRT_BURST_MS, REBUFFER, pacing,
  VST GUI click/focus, solo crackle
- them harness + plans/patch scripts
2026-08-24 07:46:09 +07:00
admin 373a96cf7b fix(fx-gui): bring plugin window to top before real click (anchored mode)
Real-input clicks were landing in whatever window sat above the anchored
plugin window (foreground Chrome in tests) — WindowFromPoint at the click
point returned the browser, so the editor never saw the input. Attach to
the foreground thread, SetForegroundWindow + BringWindowToTop before the
click (still non-TOPMOST — no floating regression from 80c663e).
2026-08-23 18:09:52 +07:00
admin 80c663e419 fix(fx-gui): re-enable real-input fallback (anchored, non-topmost) 2026-08-23 16:47:38 +07:00
admin 0acc3ee7ee fix(fx-rt): burst 4-block input batch qua bridge — hết lag/giật/crackle master FX
- worklet gom 1024 mẫu (4 block) vào 1 frame interleaved, main thread tách 4 WS frame 512 floats
- bridge take=min(avail,4) xử lí 1 call process cho burst → overhead VST3 amortize 4 lần
- engine _pump_output pace theo deadline thay vì sleep cố định (outRead 131→187.5/s)
- FX_RT_ROUNDTRIP_SAMPLES 512→1792 (RTT batching ~7 block)
2026-08-23 11:44:54 +07:00
admin 3ad379f0ba Gap 10: multiband compressor + de-esser (LR4 crossover, UI, test_62) 2026-08-23 08:25:07 +07:00
admin c8c49b6b9c Gap 4: MaximizerFx oversample 4x soft-clip + ceiling — zero-stuff + FIR33 anti-alias + post-decimation clamp (giảm aliasing fold-back, sample peak <= ceiling); test_61: impulse delay 8 mẫu, unity transparent, alias 9.1k -117dBFS, ceiling -1dB (24 passed) 2026-08-23 07:59:33 +07:00
admin 35076f680b C: realtime VST3 setParam live — Vst3Fx::setParam (title/shortTitle->ParamID, setParamNormalized + inputParameterChanges queue), RealtimeFxChain dispatch vst3, test_60 delay 1s->0.25s giua stream khong restart 2026-08-23 07:36:43 +07:00
admin 17e22bcf32 D2: LimiterFx brickwall — lookahead 1-5ms + oversample 4x + hard clip, UI toggle SOFT/BRICKWALL + LOOKAHEAD ms 2026-08-23 07:23:52 +07:00
admin c3aba40ffe Phase 4+5: WebAudio I/O shim + verify DAW checklist — live=export, order, fader, PDC, smoke 2026-08-22 21:02:52 +07:00
admin e5c957fc87 Phase 3: engine render chain hop nhat — track/master doc mastering_settings.chain (imager/maximizer), PDC probe FX_LATENCIES, fix daw_vst_bridge link BuiltinFxChain, pytest 3.2/3.3 2026-08-22 20:17:59 +07:00
admin 1390ad545b Phase 2: BuiltinFxChain C++ (8 DSP) + control ring SET_PARAM/REPORT_LATENCY
- native_bridge/src/BuiltinFxChain.{h,cpp}: 8 builtin DSP port 1:1 từ
  Python _apply_builtin_fx_chain (eq/eqpro/compressor/limiter/exciter/rebalance)
  và JS MASTER_MODULE_IO (imager/maximizer). Biquad RBJ DF2T, block-wise
  stateful. createBuiltinFx trả nullptr cho gain/normalize (legacy).
- RenderFxJob: FxSlot thêm bfx, parse builtin 8 loại, runBuiltinSlotSafe SEH,
  realtimeRunChain nhánh builtin, chainGen()/entryLatencies(), setParam
  áp live lên bfx; Vst3Fx latencySamples từ getLatencySamples().
- RealtimeFxLoop: drain ctrl ring (SET_PARAM -> chain.setParam, drop cũ khi
  đầy) + REPORT_LATENCY khi gen đổi (ipc->lat[] ring, lastGen).
- FxRealtimeIPC.h: header 18 u32 (72B), ctrl/lat slots 8, FxCtrlCmd 24B,
  FxLatReport 8B, static_asserts.
- app/core/fx_realtime.py: mirror header 72B (ctrl_write/read, lat_write/read,
  slots), set_param ghi ctrl ring qua _ctrl_enqueue_locked (guard shm),
  get_latencies drain lat ring qua _lat_drain.
- tests/test_builtin_fx_golden.py: golden SNR C++ vs Python (8 cases, ngưỡng
  30dB) + order test eq/compressor xen kẽ.
- TASKS_DAW_A.md: tick 2.1-2.9.

Test: 136 passed (4 fx_realtime_chain + 8 builtin golden + regression).
2026-08-22 19:55:08 +07:00
admin f143646ba7 fix(fx-gui): /show resize window+plugin view theo rect panel (layout khớp ô embed) — giữ offscreen, không topmost; sync sidecar mới vào bundle _internal 2026-08-22 17:52:16 +07:00
admin 4bb0db2b21 fix(fx-gui): meter VST chạy đúng — bỏ điều kiện inRead chặn peek + chống race lúc load + ẩn cửa sổ native floating 2026-08-22 17:36:31 +07:00
admin 8346bc3041 build(native): rebuild bridge + commit sidecar binary để feature theo push
- fix compile: performEdit dùng setParamNormalized (setParamFromEdit không tồn tại trong SDK này)
- rebuild fx_vst_bridge.exe/daw_vst_bridge.exe/plugin_host.exe (chứa /shm route + SHM audio feeder)
- src-tauri/binaries: hết ignore, commit binary + dll + vst3scan.json — máy khác clone về có ngay feature native
- xóa rác app.precompiled.js.bak + dọn bundle dirs (.bak/.new/_diag/.pytest_cache)
2026-08-22 17:12:18 +07:00
admin 6dfe390bda feat(fx-gui): đưa audio vào process GUI — meter VST nhảy theo âm thật qua SHM peek
- 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
2026-08-22 17:06:37 +07:00
admin 6ba38286ad fix(master-fx): loại double-processing khi load VST FX vào master fx chain
- 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.
2026-08-22 16:53:20 +07:00
3dtours 681cab4f25 fix(plugin-manager): xoa/add dir luu dung dir moi (stale closure); loc plugin file da mat khoi disk; scan VST3 giam timeout module con lai 4s va subprocess 300s 2026-08-22 15:10:35 +07:00
3dtours c07b792bd4 debug(renderfx): log tung buoc load VST3 de xac dinh diem treo (Ozone Pro) 2026-08-22 11:54:48 +07:00
3dtours ac5a171464 fix(build): setPluginSearchPath khong dung std::filesystem (block-scope alias gay C2371/C2088 tren MSVC) — dung GetFileAttributesA + find_last_of 2026-08-22 02:49:58 +00:00
3dtours 2a4ae86f5a fix(fx-bridge): SetDllDirectoryW truoc Module::create — plugin VST3 can DLL dep canh no bi LOI 0x7E (ERROR_MOD_NOT_FOUND)
- SDK module_win32 LoadLibraryW khong search thu muc plugin cho dependency DLLs
- setPluginSearchPath: bundle folder -> Contents/x86_64-win; file don -> parent dir
- ap dung ca render (vst3FxLoadInner) lan scan (scanModuleInner)
- test: ~30 plugin iZotope/RX load OK; Melodyne COM 0x80010106 la plugin dac thu (STA+license)
2026-08-22 02:45:45 +00:00
3dtours eecc4501bc perf(scan): timeout/module 30s->12s (Ozone treo vinh vien), subprocess 600->180s 2026-08-22 02:05:49 +00:00
3dtours dd2a320b2a fix(scan): fx_vst_bridge --scan timeout per-module 30s + emit UNKNOWN thay vi is_instrument=true
- RenderFxJob: safeScanModule chay tren worker thread + TerminateThread neu
  Module::create treo >30s (Ozone 11 Clarity treo vinh vien, SEH khong bat
  hang) -> scan khong bao gio ket thuc -> list_fx() timeout -> fx_paths rong
  -> filter /available vo hieu -> nut Synth hien ca VST FX
- Module crash/hang -> emit is_fx=false,is_instrument=false (UNKNOWN) thay vi
  is_instrument=true (truoc day xep VST FX crash vao danh sach instrument)
- vst_engine: list_scan_all() tra toan bo (FX+instrument+unknown); list_fx()
  loc is_fx tu cache chung
- plugins.py /available: loai ca fx_paths lan unknown_paths khoi
  vst_instruments -> nut Synth chi hien VSTi that
2026-08-22 01:53:21 +00:00
admin bb6658e03d fix(fx): realtime VST ngắt quãng khi mở MASTERING PANEL + PWR master không ảnh hưởng âm; pacing WS input/output, gate fxRt theo masterConnected, worklet cap 32 2026-08-21 21:48:56 +07:00
admin d7756b08ab fix(bridge): đồng đều âm lượng VSTi jbridge, GUI native lên top, modal instrument lọc FX
- calibrate: probe sandbox (jbridge) theo real-time pacing — child render qua SHM
  consumer-sync, probe µs-speed chỉ đo được silence/attack → makeup=1.0 mọi channel.
  Thêm virtual probeNeedsRealtime() (SandboxVst2Host → true), calibrate() Sleep
  ~1 block/5.8ms để child kịp nhận MIDI + render steady-state → makeup đo peak thật
  (3 channel Qin ≈ 2.6, trước đây = 1.0 → âm lượng đồng đều giữa các track/VSTi).
- OPEN_GUI: SetWindowPos(HWND_TOPMOST) + SetForegroundWindow + BringWindowToTop
  → GUI VSTi hiển thị ở top window, tương tác ngay.
- /api/v1/plugins/available: filter vst_instruments + extra theo is_fx của
  fx_vst_bridge --scan (trước merge entry) — modal Select Instrument chỉ còn
  soundfont + VSTi, không hiện VST FX (90 → 33).
2026-08-21 10:18:25 +07:00
admin da7ae02509 fix: VST2 qua jbridge bị tạch tạch — pace child theo consumer-sync + bridge copy full block
Root cause: child plugin_host render ~50x real-time (9323 blocks/s), bridge
đọc slot đang bị child ghi đè (torn read) và mỗi segment của 1 DAW block
đọc từ nhiều child block khác nhau -> discontinuity -> tạch thay vì âm thật.

- SandboxHostIPC: thêm bridgeConsumed[2] cuối struct (append-only, offsets
  cũ giữ nguyên) — child đếm publish/slot, bridge đếm consume/slot.
- plugin_host_main.cpp: sau khi publish 1 block, chờ bridge consume xong
  block đó mới render block kế (wait-sau-publish, không phải wait-trước-
  render — wait-trước vẫn cho phép publish 2 block liên tiếp giữa 2 lần
  consume -> bridge đọc latest sẽ bỏ block). Child giờ publish đúng 1
  block/DAW block = real-time; bridge không bao giờ stall (main loop DAW
  render + pace mọi iteration) nên không deadlock; nếu bridge chết,
  parent_alive break wait.
- SandboxVst2Host: copy full 256 mẫu vào local buffer khi slot đổi, serve
  mọi segment của 1 DAW block từ 1 child block nhất quán.

Verify: child pace 371 blocks/2s (real-time 375, trước 18647); domFreq của
waveform = 257.8Hz đúng nốt C4 (note 60) — âm thật, không phải noise;
correlation giữa các block liên tiếp âm đều ~-0.4 (waveform tuần hoàn);
GUI open path không deadlock (pace vẫn real-time, jBridge dialog + Qin_VST_
Window hiện đủ); GUI đóng -> child idle delta 0; silence_all master peak
0.000016.
2026-08-21 09:43:11 +07:00
admin 0f6235c9b9 Fix Qin GUI nền trắng khi mở lại + MIDI keyboard preview trong GUI bị câm
- plugin_host_main.cpp WM_CLOSE: destroy host window (sau effEditClose
  jBridge dialog cũ vẫn sống trong host; mở lại trên cùng window tạo
  jBridge dialog thứ 2 chồng lên -> nền trắng, editor không load). Mở lại
  tạo window mới sạch, đúng 1 jBridge dialog + Qin_VST_Window.
- plugin_host_main.cpp: bỏ idle-skip khi editor đang attach — preview phím
  MIDI trong GUI là âm nội bộ plugin, không qua host MIDI; vòng loop idle
  không gọi processAudioBlock nên voice nội bộ không bao giờ render (câm).
  GUI mở -> render liên tục; GUI đóng vẫn idle như cũ.
- Verify: mở/đóng/mở lại GUI ch1 -> host mới, đúng 1 editor, âm ch1 peak
  0.13 (GUI mở) / 0.10 (sau đóng); bridgeWrite tăng liên tục khi GUI mở.
2026-08-21 09:29:38 +07:00
admin e7e974b3e0 Fix GUI Qin không hiện lại sau hide + âm thanh lỗi sau khi đóng cửa sổ
- plugin_host_main.cpp: chặn WM_CLOSE (đóng GUI nhưng giữ window sống, hide
  thay vì destroy), WM_DESTROY reset hwnd; dùng g_hostHwnd toàn cục thay
  hwnd local để control OPEN_GUI/CLOSE_GUI tái sử dụng đúng window.
- main.cpp: bỏ qua dedupe hasAttachedView cho instrument child-own
  (SandboxVst2Host) — bridge guiOpen_ stale sau khi child tự đóng nên
  OPEN_GUI lặp lại phải forward control 4; child tự chặn double-open.
- Verify: WM_CLOSE -> window ẩn còn sống; OPEN_GUI lần 2 -> window hiện lại,
  âm ch1 vẫn kêu (peak 0.15), không câm.
2026-08-21 09:21:56 +07:00
admin a7b01d3484 fix(bridge): 3 bug âm thanh Qin/Nexus standalone
1) wavesynth tự phát khi mở app: probe calibrate() render vào live mix
   (renderAll process cùng instance) -> thêm calibratingCh_[16], renderAll
   bỏ qua channel đang calibrate; plugin_host panic (sustain off + all
   notes off + 128 noteOff) ngay sau preset apply để startup im lặng.
2) bấm GUI mở 2 cửa sổ Qin: sandbox VST2 child tự sở hữu top-level window
   -> ownsGuiWindow() + main.cpp forward OPEN_GUI control, không tạo native
   parent / không registry double-open.
3) play phát nhạc cụ sai: restore clobber — seed preset đè patch thật trong
   state file (ch3 63ba3667 -> 7f07473c) do saveStateJob chạy lúc child còn
   seed. Fix: queuePreset(waitApply=true) chờ child apply xong (presetOut
   memcmp), consume-before-apply (zero presetInLen trước khi apply), deferred
   double-load re-check trong main.cpp skip assign trùng path, watchdog
   respawn re-queue lastPreset_.
2026-08-21 08:50:28 +07:00
admin b91e6d3875 bridge: fix Qin VST2 silent playback via per-child SHM sandbox
- out-of-process VST2 sandbox: each Qin track spawns its own plugin_host.exe child
  with unique SHM (SonicForge_PluginHost2_<bridgePid>_<ch>_<seq>), watchdog <=3 respawns
- preset round-trip bridge<->child over SHM (presetIn/presetOut 64KB), stub rejection MIN_PRESET=100
- seed qin_default.b64 default preset into every fresh child; saved patch wins on restore
- forward MIDI on channel 0 (Qin_RV only listens on ch0); one instrument per child
- controls 4/5/6 = OPEN_GUI/CLOSE_GUI/QUIT
- gitignore runtime carla_projects
2026-08-20 19:16:43 +07:00
admin d6649e4474 bridge: auto-create jBridge Qin settings (RUN_IN_EXISTING_AUXHOST 0)
Makes the unlimited-Qin fix durable: bridge writes
%APPDATA%\jBridge\SettingsFilesFor{64,32}BitPlugins\Qin_RV.jBridge
at startup when missing, so every Qin instance runs in its own
auxhost on any machine. Verified: 4 Qin ch0/1/2/9 live, 4 auxhost.exe,
0 ML_RELEASE_ERROR, GUI attachView ok=1 on all.
2026-08-20 11:14:39 +07:00
admin c78d9f2911 bridge: drop 2-instance Qin cap (jBridge per-plugin settings fix)
Qin bridges via jBridge shared auxhost; 3rd live instance flooded
ML_RELEASE_ERROR (engine per-auxhost capacity, not our code). Fix:
write %APPDATA%\jBridge\SettingsFilesFor64BitPlugins\Qin_RV.jBridge
with RUN_IN_EXISTING_AUXHOST 0 -> each instance gets own auxhost,
unlimited tracks. Remove LOAD REJECT/restore SKIP guards. Verified:
4 Qin ch0/1/2/9 live, 4 auxhost.exe, 0 ML_RELEASE_ERROR, GUI all attach.
2026-08-20 11:11:27 +07:00