pub struct LoopedDecoder<R: Read + Seek> { /* private fields */ }
Expand description
Source of audio samples from decoding a file that never ends. When the end of the file is reached, the decoder starts again from the beginning.
A LoopedDecoder
will attempt to seek back to the start of the stream when it reaches
the end. If seeking fails for any reason (like IO errors), iteration will stop.
§Examples
use std::fs::File;
use rodio::Decoder;
let file = File::open("audio.mp3").unwrap();
let looped_decoder = Decoder::new_looped(file).unwrap();
Trait Implementations§
Source§impl<R> Iterator for LoopedDecoder<R>
impl<R> Iterator for LoopedDecoder<R>
Source§fn next(&mut self) -> Option<Self::Item>
fn next(&mut self) -> Option<Self::Item>
Returns the next sample in the audio stream.
When the end of the stream is reached, attempts to seek back to the start
and continue playing. If seeking fails, or if no decoder is available,
returns None
.
Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
Returns the size hint for this iterator.
The lower bound is:
- The minimum number of samples remaining in the current iteration if there is an active decoder
- 0 if there is no active decoder (inner is None)
The upper bound is always None
since the decoder loops indefinitely.
This differs from non-looped decoders which may provide a finite upper bound.
Note that even with an active decoder, reaching the end of the stream may result in the decoder becoming inactive if seeking back to the start fails.
Source§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk
)N
values. Read more1.0.0 · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 · Source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
Source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by
)n
elements. Read more1.0.0 · Source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
n
th element of the iterator. Read more1.28.0 · Source§fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self>where
Self: Sized,
1.0.0 · Source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
1.0.0 · Source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where
Self: Sized,
U: IntoIterator,
Source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
iter_intersperse
)separator
between adjacent
items of the original iterator. Read moreSource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
iter_intersperse
)separator
between adjacent items of the original iterator. Read more1.0.0 · Source§fn map<B, F>(self, f: F) -> Map<Self, F>
fn map<B, F>(self, f: F) -> Map<Self, F>
1.0.0 · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P> ⓘ
fn filter<P>(self, predicate: P) -> Filter<Self, P> ⓘ
1.0.0 · Source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
1.0.0 · Source§fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
fn enumerate(self) -> Enumerate<Self>where
Self: Sized,
1.0.0 · Source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
1.0.0 · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
1.57.0 · Source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
1.0.0 · Source§fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
fn skip(self, n: usize) -> Skip<Self>where
Self: Sized,
n
elements. Read more1.0.0 · Source§fn take(self, n: usize) -> Take<Self>where
Self: Sized,
fn take(self, n: usize) -> Take<Self>where
Self: Sized,
n
elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 · Source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
1.29.0 · Source§fn flatten(self) -> Flatten<Self>
fn flatten(self) -> Flatten<Self>
Source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
iter_map_windows
)f
for each contiguous window of size N
over
self
and returns an iterator over the outputs of f
. Like slice::windows()
,
the windows during mapping overlap as well. Read more1.0.0 · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F>
fn inspect<F>(self, f: F) -> Inspect<Self, F>
1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator
. Read moreSource§fn try_collect<B>(
&mut self,
) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
iterator_try_collect
)Source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into
)1.0.0 · Source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
Source§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned
)true
precede all those that return false
. Read more1.27.0 · Source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 · Source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 · Source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
Source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce
)1.0.0 · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 · Source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
Source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find
)1.0.0 · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 · Source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 · Source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 · Source§fn copied<'a, T>(self) -> Copied<Self>
fn copied<'a, T>(self) -> Copied<Self>
Source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where
Self: Sized,
iter_array_chunks
)N
elements of the iterator at a time. Read more1.11.0 · Source§fn product<P>(self) -> P
fn product<P>(self) -> P
Source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by
)Iterator
with those
of another with respect to the specified comparison function. Read more1.5.0 · Source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd
elements of
this Iterator
with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moreSource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by
)Iterator
with those
of another with respect to the specified comparison function. Read moreSource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by
)1.5.0 · Source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator
are lexicographically
less than those of another. Read more1.5.0 · Source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator
are lexicographically
less or equal to those of another. Read more1.5.0 · Source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator
are lexicographically
greater than those of another. Read more1.5.0 · Source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator
are lexicographically
greater than or equal to those of another. Read more1.82.0 · Source§fn is_sorted(self) -> bool
fn is_sorted(self) -> bool
1.82.0 · Source§fn is_sorted_by<F>(self, compare: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool
1.82.0 · Source§fn is_sorted_by_key<F, K>(self, f: F) -> bool
fn is_sorted_by_key<F, K>(self, f: F) -> bool
Source§impl<R> Source for LoopedDecoder<R>
impl<R> Source for LoopedDecoder<R>
Source§fn current_span_len(&self) -> Option<usize>
fn current_span_len(&self) -> Option<usize>
Returns the current span length of the underlying decoder.
Returns None
if there is no active decoder.
Source§fn channels(&self) -> ChannelCount
fn channels(&self) -> ChannelCount
Returns the number of channels in the audio stream.
Returns the default channel count if there is no active decoder.
Source§fn sample_rate(&self) -> SampleRate
fn sample_rate(&self) -> SampleRate
Returns the sample rate of the audio stream.
Returns the default sample rate if there is no active decoder.
Source§fn total_duration(&self) -> Option<Duration>
fn total_duration(&self) -> Option<Duration>
Returns the total duration of this audio source.
Always returns None
for looped decoders since they have no fixed end point -
they will continue playing indefinitely by seeking back to the start when reaching
the end of the audio data.
Source§fn try_seek(&mut self, pos: Duration) -> Result<(), SeekError>
fn try_seek(&mut self, pos: Duration) -> Result<(), SeekError>
Attempts to seek to a specific position in the audio stream.
§Errors
Returns SeekError::NotSupported
if:
- There is no active decoder
- The underlying decoder does not support seeking
May also return other SeekError
variants if the underlying decoder’s seek operation fails.
§Note
Even for looped playback, seeking past the end of the stream will not automatically wrap around to the beginning - it will return an error just like a normal decoder. Looping only occurs when reaching the end through normal playback.
Source§fn buffered(self) -> Buffered<Self> ⓘwhere
Self: Sized,
fn buffered(self) -> Buffered<Self> ⓘwhere
Self: Sized,
Source§fn repeat_infinite(self) -> Repeat<Self> ⓘwhere
Self: Sized,
fn repeat_infinite(self) -> Repeat<Self> ⓘwhere
Self: Sized,
Source§fn take_duration(self, duration: Duration) -> TakeDuration<Self> ⓘwhere
Self: Sized,
fn take_duration(self, duration: Duration) -> TakeDuration<Self> ⓘwhere
Self: Sized,
Source§fn delay(self, duration: Duration) -> Delay<Self> ⓘwhere
Self: Sized,
fn delay(self, duration: Duration) -> Delay<Self> ⓘwhere
Self: Sized,
Source§fn skip_duration(self, duration: Duration) -> SkipDuration<Self> ⓘwhere
Self: Sized,
fn skip_duration(self, duration: Duration) -> SkipDuration<Self> ⓘwhere
Self: Sized,
Source§fn amplify(self, value: f32) -> Amplify<Self> ⓘwhere
Self: Sized,
fn amplify(self, value: f32) -> Amplify<Self> ⓘwhere
Self: Sized,
Source§fn amplify_decibel(self, value: f32) -> Amplify<Self> ⓘwhere
Self: Sized,
fn amplify_decibel(self, value: f32) -> Amplify<Self> ⓘwhere
Self: Sized,
Source§fn amplify_normalized(self, value: f32) -> Amplify<Self> ⓘwhere
Self: Sized,
fn amplify_normalized(self, value: f32) -> Amplify<Self> ⓘwhere
Self: Sized,
[0.0, 1.0]
range. This method better matches the perceived
loudness of sounds in human hearing and is recommended to use when you want to change
volume in [0.0, 1.0]
range.
based on article: https://www.dr-lex.be/info-stuff/volumecontrols.html Read moreSource§fn automatic_gain_control(
self,
target_level: f32,
attack_time: f32,
release_time: f32,
absolute_max_gain: f32,
) -> AutomaticGainControl<Self> ⓘwhere
Self: Sized,
fn automatic_gain_control(
self,
target_level: f32,
attack_time: f32,
release_time: f32,
absolute_max_gain: f32,
) -> AutomaticGainControl<Self> ⓘwhere
Self: Sized,
Source§fn take_crossfade_with<S: Source>(
self,
other: S,
duration: Duration,
) -> Crossfade<Self, S>
fn take_crossfade_with<S: Source>( self, other: S, duration: Duration, ) -> Crossfade<Self, S>
Source§fn fade_out(self, duration: Duration) -> FadeOut<Self> ⓘwhere
Self: Sized,
fn fade_out(self, duration: Duration) -> FadeOut<Self> ⓘwhere
Self: Sized,
Source§fn limit(self, settings: LimitSettings) -> Limit<Self> ⓘwhere
Self: Sized,
fn limit(self, settings: LimitSettings) -> Limit<Self> ⓘwhere
Self: Sized,
Source§fn linear_gain_ramp(
self,
duration: Duration,
start_value: f32,
end_value: f32,
clamp_end: bool,
) -> LinearGainRamp<Self> ⓘwhere
Self: Sized,
fn linear_gain_ramp(
self,
duration: Duration,
start_value: f32,
end_value: f32,
clamp_end: bool,
) -> LinearGainRamp<Self> ⓘwhere
Self: Sized,
Source§fn periodic_access<F>(
self,
period: Duration,
access: F,
) -> PeriodicAccess<Self, F> ⓘ
fn periodic_access<F>( self, period: Duration, access: F, ) -> PeriodicAccess<Self, F> ⓘ
access
closure on Self
the first time the source is iterated and every
time period
elapses. Read moreSource§fn speed(self, ratio: f32) -> Speed<Self> ⓘwhere
Self: Sized,
fn speed(self, ratio: f32) -> Speed<Self> ⓘwhere
Self: Sized,
Source§fn pausable(self, initially_paused: bool) -> Pausable<Self> ⓘwhere
Self: Sized,
fn pausable(self, initially_paused: bool) -> Pausable<Self> ⓘwhere
Self: Sized,
Source§fn skippable(self) -> Skippable<Self> ⓘwhere
Self: Sized,
fn skippable(self) -> Skippable<Self> ⓘwhere
Self: Sized,
Skippable::skip
for skipping this source. Skipping
makes Source::next() return None. Which in turn makes the Sink skip to
the next source.