FIX: ensureMasteringRouting gọi getAudioContext() trước — preview đầu tiên cũng sync mastering routing

This commit is contained in:
2026-08-10 06:04:32 +00:00
parent 025e0f03a2
commit 75795653c5
3 changed files with 12 additions and 6 deletions
+5 -1
View File
@@ -20867,7 +20867,11 @@ const App = () => {
const ensureMasteringRouting = () => { const ensureMasteringRouting = () => {
try { try {
const _s = window.currentMasteringSettings; const _s = window.currentMasteringSettings;
if (!_s || !masterBus || !audioCtx) return; if (!_s) return;
// Đm bo audioCtx + masterBus đã tn ti trưc khi sync (ln preview
// đu tiên audio chưa init getAudioContext to ngay)
getAudioContext();
if (!masterBus || !audioCtx) return;
toggleMasteringOnMaster(!!_s.masterConnected, !!_s.isBypassed); toggleMasteringOnMaster(!!_s.masterConnected, !!_s.isBypassed);
applyMasteringSettings(_s); applyMasteringSettings(_s);
updateSfRouting(); updateSfRouting();
+3 -1
View File
@@ -1290,7 +1290,9 @@ const _b=effMidiBypass(t);node.sfRouteGain.gain.value=_b?0:1;node.sfDryGain.gain
// chạy khi bắt đầu preview. Hàm này ép đồng bộ 3 lớp (graph theo trạng thái // chạy khi bắt đầu preview. Hàm này ép đồng bộ 3 lớp (graph theo trạng thái
// hiện tại — early-return nếu đã đúng; tham số module; route SF + route // hiện tại — early-return nếu đã đúng; tham số module; route SF + route
// gains) — gọi tại mọi điểm preview → âm preview LUÔN qua mastering khi bật. // gains) — gọi tại mọi điểm preview → âm preview LUÔN qua mastering khi bật.
const ensureMasteringRouting=()=>{try{const _s=window.currentMasteringSettings;if(!_s||!masterBus||!audioCtx)return;toggleMasteringOnMaster(!!_s.masterConnected,!!_s.isBypassed);applyMasteringSettings(_s);updateSfRouting();}catch(e){console.warn('ensureMasteringRouting error:',e);}};const ensureMasteringRoutingRef=useRef(null);ensureMasteringRoutingRef.current=ensureMasteringRouting;window.__ensureMasteringRouting=ensureMasteringRouting;// ── MIDI preview cache (bounce nhanh offline) ── const ensureMasteringRouting=()=>{try{const _s=window.currentMasteringSettings;if(!_s)return;// Đảm bảo audioCtx + masterBus đã tồn tại trước khi sync (lần preview
// đầu tiên audio chưa init → getAudioContext tạo ngay)
getAudioContext();if(!masterBus||!audioCtx)return;toggleMasteringOnMaster(!!_s.masterConnected,!!_s.isBypassed);applyMasteringSettings(_s);updateSfRouting();}catch(e){console.warn('ensureMasteringRouting error:',e);}};const ensureMasteringRoutingRef=useRef(null);ensureMasteringRoutingRef.current=ensureMasteringRouting;window.__ensureMasteringRouting=ensureMasteringRouting;// ── MIDI preview cache (bounce nhanh offline) ──
// Khi preview: capture tiếng đàn (SF output — pre track-FX) vào cache theo // Khi preview: capture tiếng đàn (SF output — pre track-FX) vào cache theo
// track. Khi export: nếu cache đủ độ dài → render OFFLINE NHANH bằng cache // track. Khi export: nếu cache đủ độ dài → render OFFLINE NHANH bằng cache
// (qua FX Rack + Mastering như playback) — không cần chờ bounce realtime. // (qua FX Rack + Mastering như playback) — không cần chờ bounce realtime.
+4 -4
View File
@@ -31,12 +31,12 @@
<script src="https://unpkg.com/react@18.3.1/umd/react.production.min.js"></script> <script src="https://unpkg.com/react@18.3.1/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js"></script> <script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js"></script>
<script src="/static/js/services/fluidsynthLoader.js?v=202607271245"></script> <script src="/static/js/services/fluidsynthLoader.js?v=202607271245"></script>
<script src="/static/js/services/runtime.js?v=202608101400"></script> <script src="/static/js/services/runtime.js?v=202608101500"></script>
<script src="/static/js/services/api.js?v=202608101400"></script> <script src="/static/js/services/api.js?v=202608101500"></script>
<script src="/static/js/services/audioEngine.js?v=202607271016"></script> <script src="/static/js/services/audioEngine.js?v=202607271016"></script>
<script src="/static/js/services/storage.js?v=202608038200"></script> <script src="/static/js/services/storage.js?v=202608038200"></script>
<script src="/static/js/services/soundfontStorage.js?v=202607271016"></script> <script src="/static/js/services/soundfontStorage.js?v=202607271016"></script>
<script src="/static/js/services/soundfontPlayer.js?v=202608101400"></script> <script src="/static/js/services/soundfontPlayer.js?v=202608101500"></script>
<script src="/static/js/services/aiGateway.js?v=202608037200"></script> <script src="/static/js/services/aiGateway.js?v=202608037200"></script>
<script src="/static/js/services/dawCommandDispatcher.js?v=202607271016"></script> <script src="/static/js/services/dawCommandDispatcher.js?v=202607271016"></script>
<script src="/static/js/services/pianoRollTabService.js?v=202607272044"></script> <script src="/static/js/services/pianoRollTabService.js?v=202607272044"></script>
@@ -44,7 +44,7 @@
<script src="/static/js/services/midiExtractor.js?v=202607281052"></script> <script src="/static/js/services/midiExtractor.js?v=202607281052"></script>
<script src="/static/js/services/promptTemplateManager.js?v=202607281039"></script> <script src="/static/js/services/promptTemplateManager.js?v=202607281039"></script>
<script src="/static/js/services/undoRedoEngine.js?v=202607290941"></script> <script src="/static/js/services/undoRedoEngine.js?v=202607290941"></script>
<script src="/static/js/app.precompiled.js?v=202608101400" defer></script> <script src="/static/js/app.precompiled.js?v=202608101500" defer></script>
<link rel="stylesheet" href="/static/css/styles.css?v=202607271016"> <link rel="stylesheet" href="/static/css/styles.css?v=202607271016">
<style> <style>
:root { :root {