Replace deprecated ScriptProcessorNode with AudioWorklet#566
Merged
Conversation
Migrate audio output from the deprecated ScriptProcessorNode API to the modern AudioWorklet API, which runs audio processing on a dedicated thread for better performance and fewer glitches. - Add audio-worklet-processor.js with circular Float32Array ring buffer (8192 samples, ~170ms at 48kHz) for GC-free real-time audio - Rewrite speakers.js to use AudioWorkletNode with MessagePort-based sample delivery (batched in groups of 128, matching render quantum) - Inline worklet code at build time via ?raw import (works with both webpack's asset/source and Vite's native ?raw support) - Add flush() method to send partial sample batches after each frame - Simplify buffer underrun callback (worklet buffer size not queryable from main thread) - Remove ring-buffer.js (replaced by worklet's internal circular buffer) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
0444068 to
264d870
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces the deprecated ScriptProcessorNode with the modern AudioWorklet API in the web UI, eliminating main-thread audio processing for lower latency and fewer glitches.
The worklet processor is stored as a real JS file for proper tooling support but imported as a string at build time via Vite's
?rawsuffix and loaded via Blob URL. Audio samples are batched (128 at a time) and sent to the worklet via MessagePort, avoiding the need for SharedArrayBuffer and its COOP/COEP header requirements.Also removes the
ringbufferjsdependency.Closes #386