From 1c1a0e02681d4f3cf12f46f8eb903030f2339b74 Mon Sep 17 00:00:00 2001 From: OmikronApex <45161725+OmikronApex@users.noreply.github.com> Date: Thu, 9 Jul 2026 22:51:09 +0200 Subject: [PATCH] =?UTF-8?q?feat(audio):=20renderer-bus=20feeder=20?= =?UTF-8?q?=E2=80=94=20song=20audio=20into=20engine=20output=20under=20exc?= =?UTF-8?q?lusive=20mode=20(Phase=202)=20(#828)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(audio): route feedpak full-mix natively under exclusive output Song playback runs through the renderer, which WASAPI-exclusive (and ASIO) output silences. Route single-mix feedpaks (stem-less original_audio packs AND single-stem packs) onto the engine's backing transport when the output device type is exclusive-style, and migrate back to HTML5 when it isn't. Extends /api/audio-local-path to resolve /api/sloppak/.../file/... URLs via the same containment guards as serve_sloppak_file. Multi-stem packs stay on the WebAudio path (Phase 2). Includes [feedpak-route] transition-gated diagnostics logging. Co-Authored-By: Claude Fable 5 * feat(audio): renderer-bus feeder — mix renderer song audio into engine output (Phase 2) Under exclusive-style output the native backing transport (Phase 1, #824) carries loose /audio/ songs and feedpak full-mixes, but not the stems plugin's multi-stem WebAudio graph or tracks JUCE rejected. The feeder taps the renderer-side master with an AudioWorklet, re-points the owning AudioContext at a null sink so it keeps rendering without a device, and pushes ~10 ms chunks over IPC into the desktop engine's renderer bus (feedBack-desktop#90 follow-up). Inert in the Docker sphere and in shared mode. Validated by the fix12 tester spike: null-sink rendering works, clocks hold, no overflow. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: Claude Fable 5 --- static/app.js | 203 +++++++++++++++++++++++++++ tests/js/renderer_bus_feeder.test.js | 195 +++++++++++++++++++++++++ 2 files changed, 398 insertions(+) create mode 100644 tests/js/renderer_bus_feeder.test.js diff --git a/static/app.js b/static/app.js index e70eaad..3287bcb 100644 --- a/static/app.js +++ b/static/app.js @@ -5264,6 +5264,209 @@ window.jucePlayer = jucePlayer; }, 350); })(); +// Renderer-audio bus feeder (desktop Phase 2): when the engine holds the +// output endpoint in an exclusive-style mode, Chromium cannot reach the +// device, so any song audio still played by the renderer goes silent. The +// Phase 1 watcher above already migrates what a single-file transport can +// carry (loose /audio/ songs, feedpak full-mixes) onto the native backing +// transport. This feeder covers the rest — the stems plugin's multi-stem +// WebAudio graph, plus