#audio #sound #dsp #web-audio-api


A pure Rust implementation of the Web Audio API, for use in non-browser contexts

27 breaking releases

0.28.0 Jan 30, 2023
0.26.0 Nov 13, 2022
0.22.0 Jul 29, 2022
0.16.0 Mar 20, 2022
0.3.0 Mar 9, 2021

#37 in Audio

Download history 24/week @ 2022-12-05 45/week @ 2022-12-12 26/week @ 2022-12-19 17/week @ 2022-12-26 9/week @ 2023-01-02 21/week @ 2023-01-09 46/week @ 2023-01-16 29/week @ 2023-01-23 65/week @ 2023-01-30 52/week @ 2023-02-06 86/week @ 2023-02-13 55/week @ 2023-02-20 73/week @ 2023-02-27 25/week @ 2023-03-06 20/week @ 2023-03-13 32/week @ 2023-03-20

152 downloads per month
Used in point-and-click

MIT license

16K SLoC

Rust Web Audio API

crates.io docs.rs

A pure Rust implementation of the Web Audio API, for use in non-browser contexts

About the Web Audio API

The Web Audio API (MDN docs) provides a powerful and versatile system for controlling audio on the Web, allowing developers to choose audio sources, add effects to audio, create audio visualizations, apply spatial effects (such as panning) and much more.

Our Rust implementation decouples the Web Audio API from the Web. You can now use it in desktop apps, command line utilities, headless execution, etc.

Example usage

use web_audio_api::context::{AudioContext, BaseAudioContext};
use web_audio_api::node::{AudioNode, AudioScheduledSourceNode};

// set up the audio context with optimized settings for your hardware
let context = AudioContext::default();

// for background music, read from local file
let file = std::fs::File::open("samples/major-scale.ogg").unwrap();
let buffer = context.decode_audio_data_sync(file).unwrap();

// setup an AudioBufferSourceNode
let src = context.create_buffer_source();

// create a biquad filter
let biquad = context.create_biquad_filter();

// connect the audio nodes

// play the buffer

// enjoy listening
loop { }

Check out the docs for more info.

Spec compliance

We have tried to stick to the official W3C spec as close as possible, but some deviations could not be avoided:

  • naming: snake_case instead of CamelCase
  • getters/setters methods instead of exposed attributes
  • introduced some namespacing
  • AudioWorklet functionality is provided in a more rust-friendly way
  • inheritance is modelled with traits
  • ...


We provide NodeJS bindings to this library over at https://github.com/ircam-ismm/node-web-audio-api so you can use this library by simply writing native NodeJS code.

It is a work in progress, but eventually we should be able to run the official WebAudioAPI test harness and track our spec compliance improvements over time.

Audio backends

By default, the cpal library is used for cross platform audio I/O.

We offer experimental support for the cubeb backend via the cubeb feature flag. Please note that cmake must be installed locally in order to run cubeb.

Feature flag Backend Notes
cpal (default) ALSA
cpal (default) WASAPI
cpal (default) CoreAudio
cpal (default) Oboe (Android)
cpal-jack JACK
cpal-asio ASIO see https://github.com/rustaudio/cpal#asio-on-windows
cubeb PulseAudio
cubeb AudioUnit
cubeb WASAPI
cubeb OpenSL
cubeb AAudio
cubeb sndio
cubeb Sun
cubeb OSS


web-audio-api-rs welcomes contribution from everyone in the form of suggestions, bug reports, pull requests, and feedback. 💛

If you need ideas for contribution, there are several ways to get started:

  • Try out some of our examples (located in the examples/ directory) and start building your own audio graphs
  • Found a bug or have a feature request? Submit an issue!
  • Issues labeled with good first issue are relatively easy starter issues.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in web-audio-api-rs by you, shall be licensed as MIT, without any additional terms or conditions.


This project is licensed under the MIT license.


The IR files used for HRTF spatialization are part of the LISTEN database created by the EAC team from Ircam.


~750K SLoC