audioadapter-buffers 2.0.0

A selection of wrappers and buffers for audio data
Documentation
# audioadapter-buffers

This crate is part of the `audioadapter` family.

The `audioadapter` family consists of three crates:
- [audioadapter]https://crates.io/crates/audioadapter:
  The core `audioadapter` traits.
- [audioadapter-sample]https://crates.io/crates/audioadapter-sample:
  A companion crate that provides sample format conversions
  as well as extensions to the standard `Read` and `Write` traits.
- [audioadapter-buffers]https://crates.io/crates/audioadapter-buffers:
  This crate, a companion crate that provides wrappers for various common data structures.

## This crate
This crate provides a selection of wrappers and buffers
that implement the `audioadapter` traits.

## Direct wrappers
The [owned] and [direct] modules
contain implementations that pass the sample values on unchanged.
These are used when the sample data is already in a useable format,
and only the data layout needs to be handled.

### Example, wrap a vector of i16 as an interleaved stereo buffer
```rust
use audioadapter::Adapter;
use audioadapter_buffers::direct::InterleavedSlice;

// Make a vector with some dummy data.
// 2 channels * 3 frames => 6 samples
let data: Vec<i16> = vec![1, 2, 3, 4, 5, 6];

// Wrap it with an interleaved adapter
let adapter = InterleavedSlice::new(&data[..], 2, 3).unwrap();

// Loop over all samples and print their values
for channel in 0..adapter.channels() {
    for frame in 0..adapter.frames() {
        let value = adapter.read_sample(channel, frame).unwrap();
        println!("Channel: {}, frame: {}, value {}", channel, frame, value);
    }
}
```


## Converting wrappers
Audio is often exchanged as buffers of raw bytes, and it is up to each application
to treat those bytes as samples of the correct format.
The [number_to_float] module is desgined to help with this.

### Example, wrap a buffer of bytes containing interleaved raw samples
This shows how to read 24-bit integer format from raw bytes
while converting them to f32:

```rust
use audioadapter_buffers::number_to_float::InterleavedNumbers;
use audioadapter::Adapter;
use audioadapter_sample::sample::I24_LE;

// make a vector with some dummy data.
// 2 channels * 3 frames * 3 bytes per sample => 18 bytes
let data: Vec<u8> = vec![
    1, 1, 1, //frame 1, left
    2, 2, 2, //frame 1, right
    3, 3, 3, //frame 2, left
    4, 4, 4, //frame 2, right
    5, 5, 5, //frame 3, left
    6, 6, 6  //frame 3, right
];

// wrap the data
let buffer = InterleavedNumbers::<&[I24_LE], f32>::new_from_bytes(&data, 2, 3).unwrap();

// Loop over all samples and print their values
for channel in 0..buffer.channels() {
    for frame in 0..buffer.frames() {
        let value = buffer.read_sample(channel, frame).unwrap();
        println!(
            "Channel: {}, frame: {}, value: {}",
            channel, frame, value
        );
    }
}
```

Note that the example uses `I24_LE`, which means 24-bit samples
stored as 3 bytes in little-endian order without padding.
24-bit samples are also commonly stored with a padding byte, so that each sample takes up four bytes.
This is handled by selecting `I24_4RJ_LE` or `I24_4LJ_LE` as the format.

## Use without the standard library
This crate can be used in `no_std` environments if the `std` Cargo feature is disabled.
This feature is enabled by default.
Disabling it also disables all functionality that depends on the standard library,
such as the buffers in the [owned] module since they are based on [std::vec::Vec].

## License: MIT