Skip to main content

AudioBuffer

Struct AudioBuffer 

Source
pub struct AudioBuffer<const N_CHANNELS: usize>(pub [Vec<f32>; N_CHANNELS]);
Expand description

Phonon processes audio in audio buffers, which contain uncompressed Pulse Code Modulated (PCM) data (just like a .wav file).

Audio buffers contain one or more channels; for example, a stereo audio buffer contains 2 channels. Each channel typically contains several samples, which are values of the audio signal’s level at discrete points of time. Each channel has the same number of samples.

A sample is a 32-bit floating-point. The time interval between two successive samples is specified using the sampling rate. Typical sampling rates are 44100 Hz (CD quality) or 48000 Hz.

§Interleaving

Phonon stores audio buffers in a deinterleaved layout. This means that all the samples for the first channel are store contiguously, followed by all the samples for the second channel, and so on.

Most audio formats instead use an interleaved layout, where data for each frame is stored together in memory. Interleaved data can be read to and written from using AudioBuffer::read_interleaved and AudioBuffer::write_interleaved.

Tuple Fields§

§0: [Vec<f32>; N_CHANNELS]

Implementations§

Source§

impl<const N_CHANNELS: usize> AudioBuffer<N_CHANNELS>

Source

pub fn new(num_samples: usize) -> Self

Creates a new AudioBuffer with a fixed number of channels and samples.

Initalized to all zeros, representing silence.

Source

pub fn num_channels(&self) -> usize

Returns the number of channels this AudioBuffer has.

Source

pub fn num_samples(&self) -> usize

Returns the number of samples each channel has.

Source

pub fn make_silent(&mut self)

Fills the AudioBuffer with all zero samples, representing silence.

Source

pub fn mix(&mut self, other: &AudioBuffer<N_CHANNELS>)

Mixes the AudioBuffer into another by adding samples together.

Source

pub fn downmix(&self, output: &mut AudioBuffer<1>)

Mixes all channels on an AudioBuffer into a single output channel. Downmixing is performed by summing up the source channels and dividing the result by the number of source channels.

Source

pub fn read_interleaved(&mut self, source: &[f32])

Reads a slice of interleaved samples into this AudioBuffer.

Source

pub fn write_interleaved(&self, target: &mut [f32])

Writes the AudioBuffer to an interleaved slice.

Source

pub fn scale(&mut self, volume: f32)

Scales all the samples in the AudioBuffer by the given volume.

Trait Implementations§

Source§

impl<const N_CHANNELS: usize> Deref for AudioBuffer<N_CHANNELS>

Source§

type Target = [Vec<f32>; N_CHANNELS]

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<const N_CHANNELS: usize> DerefMut for AudioBuffer<N_CHANNELS>

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.

Auto Trait Implementations§

§

impl<const N_CHANNELS: usize> Freeze for AudioBuffer<N_CHANNELS>

§

impl<const N_CHANNELS: usize> RefUnwindSafe for AudioBuffer<N_CHANNELS>

§

impl<const N_CHANNELS: usize> Send for AudioBuffer<N_CHANNELS>

§

impl<const N_CHANNELS: usize> Sync for AudioBuffer<N_CHANNELS>

§

impl<const N_CHANNELS: usize> Unpin for AudioBuffer<N_CHANNELS>

§

impl<const N_CHANNELS: usize> UnsafeUnpin for AudioBuffer<N_CHANNELS>

§

impl<const N_CHANNELS: usize> UnwindSafe for AudioBuffer<N_CHANNELS>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V