fix: bounce silent — AudioRoutingEngine no longer full-tears-down sink on dest change
stopAllPlayback->updateSfRouting->startTrackPlayback reroutes bridge sink twice during bounce; each dest change previously called this.disconnect() = BridgeAudioNode teardown + async worklet reload, audio swallowed into _preBuffer (bounded 64 blocks) forever if worklet never reactivates -> silent WAV (only old reverb tail). Fix: rely on BridgeAudioNode.connect() re-pointing _gainNode (already handles dest switch without teardown); init() only when not ready. Add __sfDiag ROUTE + BRIDGE_AUDIO (frames/ peak/path per sec) to verify at bounce end.
This commit is contained in:
@@ -24,8 +24,8 @@
|
|||||||
// Idempotent: updateSfRouting/ensureMasteringRouting chay tren MOI keydown/
|
// Idempotent: updateSfRouting/ensureMasteringRouting chay tren MOI keydown/
|
||||||
// note-on — neu da noi dung dest thi KHONG disconnect (disconnect flush ring
|
// note-on — neu da noi dung dest thi KHONG disconnect (disconnect flush ring
|
||||||
// -> am phim dang vang bi cat). Chi doi khi dest/track thuc su khac.
|
// -> am phim dang vang bi cat). Chi doi khi dest/track thuc su khac.
|
||||||
|
if (window.__sfDiag) window.__sfDiag("ROUTE to=" + (trackId || "masterBus") + " prev=" + (this._trackId || "masterBus") + " bridgeReady=" + bridgeNode.isReady() + " conn=" + this._connected);
|
||||||
if (this._connected && this._dest === dest && this._trackId === (trackId || null)) return true;
|
if (this._connected && this._dest === dest && this._trackId === (trackId || null)) return true;
|
||||||
this.disconnect();
|
|
||||||
if (!bridgeNode.isReady()) bridgeNode.init();
|
if (!bridgeNode.isReady()) bridgeNode.init();
|
||||||
bridgeNode.connect(dest);
|
bridgeNode.connect(dest);
|
||||||
this._connected = true;
|
this._connected = true;
|
||||||
|
|||||||
@@ -101,6 +101,16 @@
|
|||||||
function onAudio(l, r) {
|
function onAudio(l, r) {
|
||||||
if (!_initialized) init();
|
if (!_initialized) init();
|
||||||
var blk = { l: new Float32Array(l), r: new Float32Array(r) };
|
var blk = { l: new Float32Array(l), r: new Float32Array(r) };
|
||||||
|
_frames = (_frames || 0) + blk.l.length;
|
||||||
|
for (var _i = 0; _i < blk.l.length; _i++) {
|
||||||
|
var _a = Math.abs(blk.l[_i]); if (_a > (_peak || 0)) _peak = _a;
|
||||||
|
var _b = Math.abs(blk.r[_i]); if (_b > (_peak || 0)) _peak = _b;
|
||||||
|
}
|
||||||
|
if (!_lastDiag || Date.now() - _lastDiag >= 1000) {
|
||||||
|
_lastDiag = Date.now();
|
||||||
|
if (window.__sfDiag) window.__sfDiag("BRIDGE_AUDIO frames=" + _frames + " peak=" + (_peak ? (20 * Math.log10(_peak)).toFixed(1) : "-inf") + "dB path=" + (_useWorklet ? "worklet" : (_preBuffer.length ? "preBuffer" : "chunks")));
|
||||||
|
_peak = 0;
|
||||||
|
}
|
||||||
if (_useWorklet && _workletNode) {
|
if (_useWorklet && _workletNode) {
|
||||||
_workletNode.port.postMessage({ type: 'audio', l: blk.l, r: blk.r });
|
_workletNode.port.postMessage({ type: 'audio', l: blk.l, r: blk.r });
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -40,9 +40,9 @@
|
|||||||
<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=202608101800"></script>
|
<script src="/static/js/services/soundfontPlayer.js?v=202608101800"></script>
|
||||||
<script src="/static/js/services/nativeBridgeService.js?v=202608190001"></script>
|
<script src="/static/js/services/nativeBridgeService.js?v=202608190001"></script>
|
||||||
<script src="/static/js/services/bridgeAudioNode.js?v=202608152200"></script>
|
<script src="/static/js/services/bridgeAudioNode.js?v=202608250107"></script>
|
||||||
<script src="/static/js/services/unifiedMidiRouter.js?v=202608112200"></script>
|
<script src="/static/js/services/unifiedMidiRouter.js?v=202608112200"></script>
|
||||||
<script src="/static/js/services/audioRoutingEngine.js?v=202608112200"></script>
|
<script src="/static/js/services/audioRoutingEngine.js?v=202608250107"></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>
|
||||||
|
|||||||
Reference in New Issue
Block a user