Struct ResamplingCons

Source
pub struct ResamplingCons<T: Sample> { /* private fields */ }
Expand description

The consumer end of a realtime-safe spsc channel for sending samples across streams.

If the input and output samples rates differ, then this will automatically resample the input stream to match the output stream. If the sample rates match, then no resampling will occur.

Internally this uses the ringbuf crate.

Implementations§

Source§

impl<T: Sample> ResamplingCons<T>

Source

pub fn num_channels(&self) -> NonZeroUsize

The number of channels configured for this stream.

Source

pub fn is_resampling(&self) -> bool

Returns true if resampling is occurring, false if the input and output sample rates match.

Source

pub fn output_delay(&self) -> usize

Get the delay of the internal resampler, reported as a number of output frames.

If no resampler is active, then this will return 0.

Source

pub fn available_frames(&self) -> usize

The number of frames that are currently available to read from the buffer.

Source

pub fn jitter_seconds(&self) -> f64

An number describing the current amount of jitter in seconds between the input and output streams. A value of 0.0 means the two channels are perfectly synced, a value less than 0.0 means the input channel is slower than the input channel, and a value greater than 0.0 means the input channel is faster than the output channel.

This value can be used to correct for jitter and avoid underflows/ overflows. For example, if this value goes above a certain threshold, then you can read an extra packet of data or call ResamplingCons::discard_frames or ResamplingCons::discard_jitter to correct for the jitter.

This number will be in the range [-latency_seconds, capacity_seconds - latency_seconds], where latency_seconds and capacity_seconds are the values passed in ResamplingChannelConfig when this channel was constructed.

Note, it is typical for the jitter value to be around plus or minus several milliseconds even when the streams are perfectly in sync.

Source

pub fn reset(&mut self)

Clear all queued frames in the buffer.

Source

pub fn discard_frames(&mut self, frames: usize) -> usize

Discard a certian number of input frames from the buffer. This can be used to correct for jitter and avoid overflows.

This will discard frames.min(self.available_frames()) frames.

If frames is None, then the amount of frames to return the jitter count to 0.0 will be discarded.

Returns the number of input frames that were discarded.

Source

pub fn discard_jitter(&mut self, threshold_seconds: f64) -> usize

If the value of ResamplingCons::jitter_seconds is greater than the given threshold in seconds, then discard the number of frames needed to bring the jitter value back to 0.0 to avoid overflows.

Note, it is typical for the jitter value to be around plus or minus several milliseconds even when the streams are perfectly in sync.

Returns the number of input frames that were discarded.

Source

pub fn read(&mut self, output: &mut [T]) -> ReadStatus

Read from the channel and store the results into the output buffer in interleaved format.

Auto Trait Implementations§

§

impl<T> !Freeze for ResamplingCons<T>

§

impl<T> !RefUnwindSafe for ResamplingCons<T>

§

impl<T> Send for ResamplingCons<T>

§

impl<T> !Sync for ResamplingCons<T>

§

impl<T> Unpin for ResamplingCons<T>
where T: Unpin,

§

impl<T> !UnwindSafe for ResamplingCons<T>

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<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, 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.