Skip to content

Replace deprecated ScriptProcessorNode with AudioWorklet#566

Merged
bfirsh merged 1 commit intomainfrom
bfirsh/audioworklet-support
Feb 24, 2026
Merged

Replace deprecated ScriptProcessorNode with AudioWorklet#566
bfirsh merged 1 commit intomainfrom
bfirsh/audioworklet-support

Conversation

@bfirsh
Copy link
Copy Markdown
Owner

@bfirsh bfirsh commented Feb 16, 2026

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 ?raw suffix 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 ringbufferjs dependency.

Closes #386

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>
@bfirsh bfirsh force-pushed the bfirsh/audioworklet-support branch from 0444068 to 264d870 Compare February 24, 2026 03:02
@bfirsh bfirsh merged commit fa507eb into main Feb 24, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Audio buffer with WebKitAudio

1 participant