Wait-free thread-safe single-consumer single-producer ring buffer using SharedArrayBuffer
MPL-2.0 License
ringbuf.js
A thread-safe wait-free single-consumer single-producer ring buffer for the web, and some utilities.
The main files of this library:
js/ringbuf.js
: base data structure, implementing the ring-buffer. This isjs/audioqueue.js
: wrapper for audio data streaming, without usingpostMessage
.js/param.js
: wrapper for parameter changes, allowing to send pairs of indexpostMessage
.https://ringbuf-js.netlify.app/ is a deployment of the examples in this repository with a web server that answers with the right headers for this directory, and allows the example to work. More details available at Planned changes to shared memory .
Those examples work in browsers that support both the AudioWorklet
, and
SharedArrayBuffer
.
While most real-time audio work should happen on a real-time thread (which means
inside the AudioWorkletGlobaleScope
on the Web), sending (resp. receiving) audio
to (from) a non-real-time thread is useful:
AudioWorklet
(no need to fiddle withAudioBufferSourceNode
, etc.)AudioContext
using anAudioWorkletNode
with a very high degree of reliability and extremeSDL_QueueAudio
) withoutOffscreenCanvas
, shielding the audio processing and visualization from main
cd public; node ../server.js
This is a simple web server that sets the right headers to use
SharedArrayBuffer
(see Planned changes to shared memory
on MDN).
Please do (just open an issue or send a PR).
make build
allows running the build step and copying the file to allow the example to work.
make doc
allows rebuilding the documentation.
This needs the SharedArrayBuffer
, so a couple of HTTP headers might need to be
set on the web server serving the page.
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
As of 2023-05-25, the following browsers are compatible:
Mozilla Public License 2.0