FIX: sửa lỗi chuyển từ tab PIANO ROLL TAB sang MAIN SESSION/SECTION-TAB không đồng bộ playhead
This commit is contained in:
+32
-10
@@ -14838,7 +14838,12 @@ const App = () => {
|
||||
if (prevTab !== activeTab) {
|
||||
const prevSub = subTabsRef.current.find(s => s.id === prevTab);
|
||||
if (prevSub && prevSub.isPlaying) {
|
||||
try { stopAllPlayback(); } catch (e) {}
|
||||
// PIANO ROLL tab: KHÔNG stop âm khi rời tab (SF notes đã schedule —
|
||||
// tiếp tục kêu tự nhiên — user: chuyển tab qua lại KHÔNG được câm).
|
||||
// Audio sub-tab (buffer source riêng): vẫn stop như cũ.
|
||||
if (prevSub.type !== 'PIANO_ROLL') {
|
||||
try { stopAllPlayback(); } catch (e) {}
|
||||
}
|
||||
setSubTabs(prev => prev.map(s => s.id === prevTab ? { ...s, isPlaying: false } : s));
|
||||
// Resume main/session play khi rời PIANO ROLL tab đã play (Space):
|
||||
// play piano roll → stopAllPlayback dừng main → quay lại MAIN/SECTION
|
||||
@@ -14857,6 +14862,17 @@ const App = () => {
|
||||
startTrackPlayback(_resumeAt);
|
||||
setIsPlaying(true);
|
||||
} catch (e) { console.warn('[Resume] error:', e); }
|
||||
} else if (prevSub.type === 'PIANO_ROLL' && (activeTab === 'main' || (activeTab && activeTab.startsWith('session_')))) {
|
||||
// Play THUẦN piano roll (main chưa từng play — mainResumeRef null):
|
||||
// rời tab → KHÔNG stop âm (0415) — NHƯNG isPlaying=false → nhánh
|
||||
// main updatePlayhead `if (!isPlaying) return` → playhead NGỪNG dù
|
||||
// âm piano roll còn kêu (user: playhead không đồng bộ/ngừng khi
|
||||
// chuyển tab). → setIsPlaying(true): playhead main/section chạy theo
|
||||
// elapsed (startOffsetTimeRef/startAudioTimeRef đang là của piano
|
||||
// roll play — đồng bộ với âm đang phát). Hết bài (projectEnd) →
|
||||
// nhánh main tự stop.
|
||||
console.log('[Playhead] tiếp tục theo piano roll (không stop âm) — activeTab=' + activeTab);
|
||||
setIsPlaying(true);
|
||||
}
|
||||
} else if (prevSub && prevSub.type === 'PIANO_ROLL') {
|
||||
// Rời PIANO ROLL tab KHÔNG play: main/section play ngầm vẫn chạy (âm
|
||||
@@ -15936,7 +15952,12 @@ const App = () => {
|
||||
const handler = e => {
|
||||
// Bypass global hotkeys when typing inside input/textarea/contentEditable elements
|
||||
if (e.target && (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA' || e.target.isContentEditable)) {
|
||||
return;
|
||||
// PIANO ROLL tab: Space LUÔN play/stop (user yêu cầu — transport phải
|
||||
// capture được kể cả khi có input đang focus trong tab) — các phím
|
||||
// khác vẫn bypass để gõ liệu bình thường.
|
||||
if (!(e.key === ' ' || e.code === 'Space') || !activeTabRef.current || !activeTabRef.current.startsWith('midi_')) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
const ctrl = e.ctrlKey || e.metaKey;
|
||||
const alt = e.altKey;
|
||||
@@ -18465,14 +18486,15 @@ const App = () => {
|
||||
const st = subTabsRef.current.find(s => s.id === activeTabRef.current);
|
||||
if (!st || !st.buffer) return;
|
||||
if (!st.isPlaying) {
|
||||
// PIANO ROLL / sub-tab KHÔNG play (mới mở, đang edit): playhead của
|
||||
// MAIN/SECTION KHÔNG được tiếp tục di chuyển (yêu cầu user) — KHÔNG
|
||||
// setCurrentTime. Loop phải TIẾP TỤC (rAF) để khi quay lại tab playhead
|
||||
// không nhảy vọt sai lệch. ⚠️ KHÔNG check projectEnd ở đây: projectEnd
|
||||
// tính theo activeTab — piano roll tab (sub-tab) → projectEnd = 1s →
|
||||
// updatedTime (elapsed thật) >= 1 → stopAllPlayback NGAY → CÂM + panic
|
||||
// notes. Âm main đã schedule hết từ startTrackPlayback — tự hết đúng
|
||||
// lúc; khi quay lại MAIN nhánh main tự stop tại projectEnd thật.
|
||||
// PIANO ROLL / sub-tab KHÔNG play: playhead theo MAIN/SECTION nếu đang
|
||||
// play (đồng bộ vị trí âm THẬT — user: di chuyển tab qua lại → quay
|
||||
// lại piano roll tab → playhead phải chạy theo âm đang phát); không
|
||||
// có play nào → đứng yên (chế độ edit). Loop luôn tiếp tục (rAF).
|
||||
if (isPlaying) {
|
||||
const context = getAudioContext();
|
||||
const _ph = startOffsetTimeRef.current + (context.currentTime - startAudioTimeRef.current);
|
||||
setSubTabs(prev => prev.map(s => s.id === st.id ? { ...s, currentTime: _ph } : s));
|
||||
}
|
||||
animationFrameIdRef.current = requestAnimationFrame(updatePlayhead);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user