geng_rodio/source/
repeat.rs1use std::time::Duration;
2
3use crate::source::buffered::Buffered;
4
5use crate::{Sample, Source};
6
7pub 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
20pub 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 (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}