diff --git a/app/static/js/app.jsx b/app/static/js/app.jsx index f00618f..da87ae7 100644 --- a/app/static/js/app.jsx +++ b/app/static/js/app.jsx @@ -2165,7 +2165,7 @@ function fxRtStop(silent) { // ≈ 1792) + FILL buffer 16 block (4096) = 23 block ≈ 5888 (~123ms @48k). Giữ // đồng bộ với sf-fx-realtime.js. FX_RT_START_EST_MS: ước lượng khởi đầu khi // chưa có phép đo (fx_play_first) — dùng cho freeze playhead thay V39 0.31s. -const FX_RT_ROUNDTRIP_SAMPLES = 5888; +const FX_RT_ROUNDTRIP_SAMPLES = 7936; const FX_RT_START_EST_MS = 450; // G3: anchor processed — playhead = startOffset + (processed - anchor - latency)/sr // (da tru latency -> bam vi tri mau NGHE DUOC; pre-roll tu giu tai startOffset — diff --git a/app/static/js/sf-fx-realtime.js b/app/static/js/sf-fx-realtime.js index 000c115..c3fa205 100644 --- a/app/static/js/sf-fx-realtime.js +++ b/app/static/js/sf-fx-realtime.js @@ -29,8 +29,8 @@ class SfFxRealtimeProcessor extends AudioWorkletProcessor { super(); this.BLOCK = 256; // FXRT_BLOCK this.BURST = 4; // số block gom 1 frame (bridge batch) - this.FILL = 16; // V43: 16 block ~85ms @48k: buffer khởi đầu — hấp thụ jitter main-thread (GUI decode, rAF, VST panel). PDC 5888 = (7+16)*256 (fxRtApplyPdc). V40 giam 24->8 -> cushion = FILL - d ~3-8; pump/WS gap 42ms + queue 3 -> underrun (fx_stats u=1 q=0 trong log). V43 len 16 -> cushion ~11-16, ngang muc q=10-15 sau flush/resume (het underrun trong log). - this.RESUME_FILL = 16; // V26: re-buffer khi resume SAU STOP (flush_for_stop) — 16 block ~85ms (V43: = FILL) → play kế tiếp bắt đầu nhanh; underrun-stall vẫn dùng FILL (crackle/wobble). + this.FILL = 24; // V44: 24 block ~128ms @48k: buffer khởi đầu — hấp thụ jitter main-thread + stall deschedule bridge 68-138ms. PDC 7936 = (7+24)*256 (fxRtApplyPdc). V43 16 -> cushion ~9 (q 3-9) chua du: stall 68-82ms van gay underrun. V44 len 24 -> cushion ~17 (~90ms). + this.RESUME_FILL = 24; // V26: re-buffer khi resume SAU STOP (flush_for_stop) — 16 block ~85ms (V43: = FILL) → play kế tiếp bắt đầu nhanh; underrun-stall vẫn dùng FILL (crackle/wobble). this.resumeFill = this.FILL; // mức re-buffer khi resume sau flush — stop: RESUME_FILL, underrun-stall: FILL this.CAP = 32; // V40: cap queue chặn overflow (~170ms) this.HOLD_FADE = 4; // 4 block ~21ms: fade 1→0 sau HOLD hết (hết click cắt cứng) diff --git a/native_bridge/juce_fx/JuceFxLoop.cpp b/native_bridge/juce_fx/JuceFxLoop.cpp index ada1265..c4048a7 100644 --- a/native_bridge/juce_fx/JuceFxLoop.cpp +++ b/native_bridge/juce_fx/JuceFxLoop.cpp @@ -121,7 +121,7 @@ int run_juce_fx_loop(const std::string& jobPath, const std::string& shmName, #ifdef _WIN32 timeBeginPeriod(1); - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); #endif // Engine: prepare graph (chain theo fx_chain). sr/block từ job; header là diff --git a/native_bridge/src/RealtimeFxLoop.cpp b/native_bridge/src/RealtimeFxLoop.cpp index 2af7d64..46e59ff 100644 --- a/native_bridge/src/RealtimeFxLoop.cpp +++ b/native_bridge/src/RealtimeFxLoop.cpp @@ -141,7 +141,7 @@ int run_realtime_fx_loop(const std::string& jobPath, const std::string& shmName, // (fx-gui spawn + VST load instance thu 2, native VSTi GUI open...) preempt // -> underrun -> am bi "bop nghet"/ngat quan. ChannelWorker (main.cpp) // da dung THREAD_PRIORITY_ABOVE_NORMAL. - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); #endif // Chờ chain ĐẦU TIÊN được worker build xong (gen>=1) trước khi READY. // setChain() là ASYNC — worker thread load VST3 + preset mất 1-4s; nếu set