// app/static/js/services/audioRoutingEngine.js // Routes the native bridge audio node into the DAW graph: // bridge node -> track.sfEntry (FX rack chain) -> fader/pan -> masterBus // Falls back to masterBus.input when no per-track sfEntry exists. (function () { var engine = { _connected: false, _trackId: null, isConnected: function () { return this._connected; }, /** bridgeNode = window.BridgeAudioNode; trackCtx = track node ({ sfEntry, gainNode }). */ connect: function (bridgeNode, trackCtx, trackId) { if (!bridgeNode || !bridgeNode.getOutputNode) return false; this.disconnect(); var dest = null; if (trackCtx && trackCtx.sfEntry) dest = trackCtx.sfEntry; else if (trackCtx && trackCtx.gainNode) dest = trackCtx.gainNode; else if (window.masterBus && window.masterBus.input) dest = window.masterBus.input; if (!dest) { console.warn('[AudioRoutingEngine] no destination (no trackCtx / masterBus)'); return false; } if (!bridgeNode.isReady()) bridgeNode.init(); bridgeNode.connect(dest); this._connected = true; this._trackId = trackId || null; console.log('[AudioRoutingEngine] bridge audio -> ' + (trackId || 'masterBus')); return true; }, disconnect: function () { if (window.BridgeAudioNode) window.BridgeAudioNode.disconnect(); this._connected = false; this._trackId = null; } }; window.AudioRoutingEngine = engine; })();