Struct rotary::sequential::Sequential[][src]

pub struct Sequential<T> where
    T: Sample
{ /* fields omitted */ }

A dynamically sized, multi-channel sequential audio buffer.

A sequential audio buffer stores all audio data sequentially in memory, one channel after another.

An audio buffer is constrained to only support sample-apt types. For more information of what this means, see Sample.

Resizing the buffer might therefore cause a fair bit of copying, and for the worst cases, this might result in having to copy a memory region byte-by-byte since they might overlap.

Resized regions also aren’t zeroed, so certain operations might cause stale data to be visible after a resize.

let mut buffer = rotary::Sequential::<f32>::with_topology(2, 4);
buffer[0].copy_from_slice(&[1.0, 2.0, 3.0, 4.0]);
buffer[1].copy_from_slice(&[2.0, 3.0, 4.0, 5.0]);

buffer.resize(3);

assert_eq!(&buffer[0], &[1.0, 2.0, 3.0]);
assert_eq!(&buffer[1], &[2.0, 3.0, 4.0]);

buffer.resize(4);

assert_eq!(&buffer[0], &[1.0, 2.0, 3.0, 2.0]); // <- 2.0 is stale data.
assert_eq!(&buffer[1], &[2.0, 3.0, 4.0, 5.0]); // <- 5.0 is stale data.

To access the full, currently assumed valid slice you can use Sequential::as_slice or Sequential::into_vec.

let mut buffer = rotary::Sequential::<f32>::with_topology(2, 4);
buffer[0].copy_from_slice(&[1.0, 2.0, 3.0, 4.0]);
buffer[1].copy_from_slice(&[2.0, 3.0, 4.0, 5.0]);

buffer.resize(3);

assert_eq!(buffer.as_slice(), &[1.0, 2.0, 3.0, 2.0, 3.0, 4.0]);

Implementations

impl<T> Sequential<T> where
    T: Sample
[src]

pub fn new() -> Self[src]

Construct a new empty audio buffer.

Examples

let mut buffer = rotary::Sequential::<f32>::new();

assert_eq!(buffer.frames(), 0);

pub fn with_topology(channels: usize, frames: usize) -> Self[src]

Allocate an audio buffer with the given topology. A “topology” is a given number of channels and the corresponding number of frames in their buffers.

Examples

let mut buffer = rotary::Sequential::<f32>::with_topology(4, 256);

assert_eq!(buffer.frames(), 256);
assert_eq!(buffer.channels(), 4);

pub fn from_vec(data: Vec<T>, channels: usize, frames: usize) -> Self[src]

Allocate an audio buffer from a fixed-size array.

See dynamic!.

Examples

use rotary::BitSet;

let mut buffer = rotary::sequential![[2.0; 256]; 4];

assert_eq!(buffer.frames(), 256);
assert_eq!(buffer.channels(), 4);

for chan in &buffer {
    assert_eq!(chan, vec![2.0; 256]);
}

pub fn into_vec(self) -> Vec<T>[src]

Take ownership of the backing vector.

Examples

let mut buffer = rotary::Sequential::<f32>::with_topology(2, 4);
buffer[0].copy_from_slice(&[1.0, 2.0, 3.0, 4.0]);
buffer[1].copy_from_slice(&[2.0, 3.0, 4.0, 5.0]);

buffer.resize(3);

assert_eq!(buffer.into_vec(), vec![1.0, 2.0, 3.0, 2.0, 3.0, 4.0])

pub fn as_slice(&self) -> &[T][src]

Access the underlying vector as a slice.

Examples

let mut buffer = rotary::Sequential::<f32>::with_topology(2, 4);
buffer[0].copy_from_slice(&[1.0, 2.0, 3.0, 4.0]);
buffer[1].copy_from_slice(&[2.0, 3.0, 4.0, 5.0]);

buffer.resize(3);

assert_eq!(buffer.as_slice(), &[1.0, 2.0, 3.0, 2.0, 3.0, 4.0])

pub fn frames(&self) -> usize[src]

Get the number of frames in the channels of an audio buffer.

Examples

let mut buffer = rotary::Sequential::<f32>::new();

assert_eq!(buffer.frames(), 0);
buffer.resize(256);
assert_eq!(buffer.frames(), 256);

pub fn channels(&self) -> usize[src]

Check how many channels there are in the buffer.

Examples

let mut buffer = rotary::Sequential::<f32>::new();

assert_eq!(buffer.channels(), 0);
buffer.resize_channels(2);
assert_eq!(buffer.channels(), 2);

pub fn iter(&self) -> Iter<'_, T>

Notable traits for Iter<'a, T>

impl<'a, T> Iterator for Iter<'a, T> where
    T: Sample
type Item = &'a [T];
[src]

Construct an iterator over all available channels.

Examples

use rand::Rng as _;

let mut buffer = rotary::Sequential::<f32>::with_topology(4, 256);

let all_zeros = vec![0.0; 256];

for chan in buffer.iter() {
    assert_eq!(chan, &all_zeros[..]);
}

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Notable traits for IterMut<'a, T>

impl<'a, T> Iterator for IterMut<'a, T> where
    T: Sample
type Item = &'a mut [T];
[src]

Construct a mutable iterator over all available channels.

Examples

use rand::Rng as _;

let mut buffer = rotary::Sequential::<f32>::with_topology(4, 256);
let mut rng = rand::thread_rng();

for chan in buffer.iter_mut() {
    rng.fill(chan);
}

pub fn resize_channels(&mut self, channels: usize)[src]

Set the number of channels in use.

If the size of the buffer increases as a result, the new channels will be zeroed. If the size decreases, the channels that falls outside of the new size will be dropped.

Examples

let mut buffer = rotary::Sequential::<f32>::new();

assert_eq!(buffer.channels(), 0);
assert_eq!(buffer.frames(), 0);

buffer.resize_channels(4);
buffer.resize(256);

assert_eq!(buffer.channels(), 4);
assert_eq!(buffer.frames(), 256);

pub fn resize(&mut self, frames: usize)[src]

Set the size of the buffer. The size is the size of each channel’s buffer.

If the size of the buffer increases as a result, the new regions in the frames will be zeroed. If the size decreases, the region will be left untouched. So if followed by another increase, the data will be “dirty”.

Examples

let mut buffer = rotary::Sequential::<f32>::new();

assert_eq!(buffer.channels(), 0);
assert_eq!(buffer.frames(), 0);

buffer.resize_channels(4);
buffer.resize(256);

assert_eq!(buffer[1][128], 0.0);
buffer[1][128] = 42.0;

assert_eq!(buffer.channels(), 4);
assert_eq!(buffer.frames(), 256);

Decreasing and increasing the size will modify the underlying buffer:

assert_eq!(buffer[1][128], 0.0);
buffer[1][128] = 42.0;

buffer.resize(64);
assert!(buffer[1].get(128).is_none());

buffer.resize(256);
assert_eq!(buffer[1][128], 0.0);

Stale data

Resizing a channel doesn’t “free” the underlying data or zero previously initialized regions.

Old regions which were previously sized out and ignored might contain stale data from previous uses. So this should be kept in mind when resizing this buffer dynamically.

let mut buffer = rotary::Sequential::<f32>::new();

buffer.resize_channels(4);
buffer.resize(128);

let expected = (0..128).map(|v| v as f32).collect::<Vec<_>>();

for chan in buffer.iter_mut() {
    for (s, v) in chan.iter_mut().zip(&expected) {
        *s = *v;
    }
}

assert_eq!(buffer.get(0), Some(&expected[..]));
assert_eq!(buffer.get(1), Some(&expected[..]));
assert_eq!(buffer.get(2), Some(&expected[..]));
assert_eq!(buffer.get(3), Some(&expected[..]));
assert_eq!(buffer.get(4), None);

buffer.resize_channels(2);

assert_eq!(buffer.get(0), Some(&expected[..]));
assert_eq!(buffer.get(1), Some(&expected[..]));
assert_eq!(buffer.get(2), None);

// shrink
buffer.resize(64);

assert_eq!(buffer.get(0), Some(&expected[..64]));
assert_eq!(buffer.get(1), Some(&expected[..64]));
assert_eq!(buffer.get(2), None);

// increase - this causes some weirdness.
buffer.resize(128);

let first_overlapping = expected[..64]
    .iter()
    .chain(expected[..64].iter())
    .copied()
    .collect::<Vec<_>>();

assert_eq!(buffer.get(0), Some(&first_overlapping[..]));
// Note: second channel matches perfectly up with an old channel that was
// masked out.
assert_eq!(buffer.get(1), Some(&expected[..]));
assert_eq!(buffer.get(2), None);

pub fn get(&self, channel: usize) -> Option<&[T]>[src]

Get a reference to the buffer of the given channel.

Examples

let mut buffer = rotary::Sequential::<f32>::new();

buffer.resize_channels(4);
buffer.resize(256);

let expected = vec![0.0; 256];

assert_eq!(Some(&expected[..]), buffer.get(0));
assert_eq!(Some(&expected[..]), buffer.get(1));
assert_eq!(Some(&expected[..]), buffer.get(2));
assert_eq!(Some(&expected[..]), buffer.get(3));
assert_eq!(None, buffer.get(4));

pub fn get_mut(&mut self, channel: usize) -> Option<&mut [T]>[src]

Get a mutable reference to the buffer of the given channel.

Examples

use rand::Rng as _;

let mut buffer = rotary::Sequential::<f32>::new();

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

let mut rng = rand::thread_rng();

if let Some(left) = buffer.get_mut(0) {
    rng.fill(left);
}

if let Some(right) = buffer.get_mut(1) {
    rng.fill(right);
}

Trait Implementations

impl<T> Buf<T> for Sequential<T> where
    T: Sample
[src]

impl<T> BufMut<T> for Sequential<T> where
    T: Sample
[src]

impl<T> Debug for Sequential<T> where
    T: Sample + Debug
[src]

impl<T> Eq for Sequential<T> where
    T: Sample + Eq
[src]

impl<T> Hash for Sequential<T> where
    T: Sample + Hash
[src]

impl<T> Index<usize> for Sequential<T> where
    T: Sample
[src]

type Output = [T]

The returned type after indexing.

impl<T> IndexMut<usize> for Sequential<T> where
    T: Sample
[src]

impl<'a, T> IntoIterator for &'a Sequential<T> where
    T: Sample
[src]

type IntoIter = Iter<'a, T>

Which kind of iterator are we turning this into?

type Item = <Self::IntoIter as Iterator>::Item

The type of the elements being iterated over.

impl<'a, T> IntoIterator for &'a mut Sequential<T> where
    T: Sample
[src]

type IntoIter = IterMut<'a, T>

Which kind of iterator are we turning this into?

type Item = <Self::IntoIter as Iterator>::Item

The type of the elements being iterated over.

impl<T> Ord for Sequential<T> where
    T: Sample + Ord
[src]

impl<T> PartialEq<Sequential<T>> for Sequential<T> where
    T: Sample + PartialEq
[src]

impl<T> PartialOrd<Sequential<T>> for Sequential<T> where
    T: Sample + PartialOrd
[src]

Auto Trait Implementations

impl<T> RefUnwindSafe for Sequential<T> where
    T: RefUnwindSafe

impl<T> Send for Sequential<T> where
    T: Send

impl<T> Sync for Sequential<T> where
    T: Sync

impl<T> Unpin for Sequential<T> where
    T: Unpin

impl<T> UnwindSafe for Sequential<T> where
    T: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.