#node #oscillator #engine #audio-playback #buffer #real-time

nightly rawdio

An Audio Engine, inspired by the Web Audio API

10 breaking releases

0.13.0 Dec 16, 2023
0.11.0 Dec 12, 2023
0.8.0 May 15, 2023

#605 in Audio

MIT license

300KB
7.5K SLoC

Rust Audio Engine

Rust

Crates.io

docs.rs

This is an audio engine, inspired by the Web Audio API.

Oscillator Example

More examples can be found here

  1. Create an engine

    use rawdio::{connect_nodes, create_engine, Level, Oscillator, Node};
    let sample_rate = 44_100;
    let (mut context, mut process) = create_engine(sample_rate);
    
  2. Create an oscillator

    let frequency = 440.0;
    let output_channel_count = 2;
    let mut oscillator = Oscillator::sine(context.as_ref(), frequency, output_channel_count);
    
  3. Set the gain on the oscillator

    let level = Level::from_db(-3.0);
    oscillator
        .gain()
        .set_value_at_time(level.as_gain(), Timestamp::zero());
    
  4. Connect to output

    connect_nodes!(oscillator => "output");
    
  5. Start the context

    context.start();
    
  6. Run the process to get samples. This will vary depending on whether you wish to run the engine in realtime (e.g. using CPAL) or offline (e.g. to a file). The engine doesn't make any assumptions, and will simply wait to be asked to process.

    All audio buffers are assumed to be non-interleaved. So if the audio that comes from your soundcard is interleaved, it will need to be de-interleaved first.

    let input_buffer = /*create an input buffer*/
    let output_buffer = /*create an audio buffer*/
    process.process (&mut output_buffer);
    

To run an example

cd examples && cargo run --bin [example_name] [example_args]

To run the tests

cargo test

To run the benchmarks

cargo bench

Where do the buffers come from?

The engine won't make any assumptions about how it is going to be run. This means that it can be run in real-time, for example using CPAL. Or, it could be run offline, for example processing audio from files using hound. There are examples of both of these in the /examples directory.

Bear in mind that audio is expected to be de-interleaved. Most soundcards and audio files will be interleaved, so it will need to be converted first.

Dependencies

~6.5MB
~117K SLoC