rotary

Documentation Crates Actions Status

A library for dealing efficiently with Dynamic non-interleaved audio buffers.

The buffer is constructed similarly to a Vec<Vec<T>>, except the interior vector has a fixed size. And the buffer makes no attempt to clear data which is freed when using functions such as [Dynamic::resize].

```rust use rand::Rng as _;

let mut buffer = rotary::Dynamic::::new();

buffer.resize_channels(2); buffer.resize(2048);

/// Fill both channels with random noise. let mut rng = rand::thread_rng(); rng.fill(&mut buffer[0]); rng.fill(&mut buffer[1]); ```

You can use masked audio buffers if you need the ability to temporarily enable or disable channels. This requires that you specify the type of the mask. A good option for this is a [BitSet], which supports up to 128 channels.

```rust use rotary::BitSet;

let mut buffer = rotary::MaskedDynamic::>::with_topology(4, 128);

buffer.mask(1);

for channel in buffer.iter_mut() { for b in channel { *b = 1.0; } }

let expected = vec![1.0f32; 128];

asserteq!(&buffer[0], &expected[..]); asserteq!(&buffer[1], &[][..]); asserteq!(&buffer[2], &expected[..]); asserteq!(&buffer[3], &expected[..]); ```

For convenience we also provide the [dynamic!] macro when constructing audio buffers.

```rust use rotary::BitSet;

let mut buf = rotary::Dynamic::::with_topology(4, 128);

for channel in &mut buf { for f in channel { *f = 2.0; } }

assert_eq!(buf, rotary::dynamic![[2.0; 128]; 4]) ```

License: MIT/Apache-2.0