pub struct ResamplingProd<T: Sample> { /* private fields */ }
Expand description
The producer 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> ResamplingProd<T>
impl<T: Sample> ResamplingProd<T>
Sourcepub fn push(&mut self, data: &[T]) -> usize
pub fn push(&mut self, data: &[T]) -> usize
Push the given data in interleaved format.
Returns the number of frames (not samples) that were successfully pushed.
If this number is less than the number of frames in data
, then it means
an overflow has occured.
Sourcepub fn available_frames(&self) -> usize
pub fn available_frames(&self) -> usize
Returns the number of frames that are currently available to be pushed to the buffer.
Sourcepub fn num_channels(&self) -> NonZeroUsize
pub fn num_channels(&self) -> NonZeroUsize
The number of channels configured for this stream.
Sourcepub fn jitter_seconds(&self) -> f64
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 below a certain threshold, then you can push an extra packet of data 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
out_max_block_frames / out_sample_rate
or data_frames / in_sample_rate
(whichever is higher) even when the streams are perfectly in sync
(data_frames
being the typical length in frames of a packet of data pushed
to ResamplingProd::push
).