geng_rodio/source/
repeat.rs

1use std::time::Duration;
2
3use crate::source::buffered::Buffered;
4
5use crate::{Sample, Source};
6
7/// Internal function that builds a `Repeat` object.
8pub fn repeat<I>(input: I) -> Repeat<I>
9where
10    I: Source,
11    I::Item: Sample,
12{
13    let input = input.buffered();
14    Repeat {
15        inner: input.clone(),
16        next: input,
17    }
18}
19
20/// A source that repeats the given source.
21pub struct Repeat<I>
22where
23    I: Source,
24    I::Item: Sample,
25{
26    inner: Buffered<I>,
27    next: Buffered<I>,
28}
29
30impl<I> Iterator for Repeat<I>
31where
32    I: Source,
33    I::Item: Sample,
34{
35    type Item = <I as Iterator>::Item;
36
37    #[inline]
38    fn next(&mut self) -> Option<<I as Iterator>::Item> {
39        if let Some(value) = self.inner.next() {
40            return Some(value);
41        }
42
43        self.inner = self.next.clone();
44        self.inner.next()
45    }
46
47    #[inline]
48    fn size_hint(&self) -> (usize, Option<usize>) {
49        // infinite
50        (0, None)
51    }
52}
53
54impl<I> Source for Repeat<I>
55where
56    I: Iterator + Source,
57    I::Item: Sample,
58{
59    #[inline]
60    fn current_frame_len(&self) -> Option<usize> {
61        match self.inner.current_frame_len() {
62            Some(0) => self.next.current_frame_len(),
63            a => a,
64        }
65    }
66
67    #[inline]
68    fn channels(&self) -> u16 {
69        match self.inner.current_frame_len() {
70            Some(0) => self.next.channels(),
71            _ => self.inner.channels(),
72        }
73    }
74
75    #[inline]
76    fn sample_rate(&self) -> u32 {
77        match self.inner.current_frame_len() {
78            Some(0) => self.next.sample_rate(),
79            _ => self.inner.sample_rate(),
80        }
81    }
82
83    #[inline]
84    fn total_duration(&self) -> Option<Duration> {
85        None
86    }
87}
88
89impl<I> Clone for Repeat<I>
90where
91    I: Source,
92    I::Item: Sample,
93{
94    #[inline]
95    fn clone(&self) -> Repeat<I> {
96        Repeat {
97            inner: self.inner.clone(),
98            next: self.next.clone(),
99        }
100    }
101}