geng_rodio/source/
zero.rs

1use std::marker::PhantomData;
2use std::time::Duration;
3
4use crate::{Sample, Source};
5
6/// An infinite source that produces zero.
7#[derive(Clone, Debug)]
8pub struct Zero<S> {
9    channels: u16,
10    sample_rate: u32,
11    num_samples: Option<usize>,
12    marker: PhantomData<S>,
13}
14
15impl<S> Zero<S> {
16    #[inline]
17    pub fn new(channels: u16, sample_rate: u32) -> Zero<S> {
18        Zero {
19            channels,
20            sample_rate,
21            num_samples: None,
22            marker: PhantomData,
23        }
24    }
25    #[inline]
26    pub fn new_samples(channels: u16, sample_rate: u32, num_samples: usize) -> Zero<S> {
27        Zero {
28            channels,
29            sample_rate,
30            num_samples: Some(num_samples),
31            marker: PhantomData,
32        }
33    }
34}
35
36impl<S> Iterator for Zero<S>
37where
38    S: Sample,
39{
40    type Item = S;
41
42    #[inline]
43    fn next(&mut self) -> Option<S> {
44        if let Some(num_samples) = self.num_samples {
45            if num_samples > 0 {
46                self.num_samples = Some(num_samples - 1);
47                Some(S::zero_value())
48            } else {
49                None
50            }
51        } else {
52            Some(S::zero_value())
53        }
54    }
55}
56
57impl<S> Source for Zero<S>
58where
59    S: Sample,
60{
61    #[inline]
62    fn current_frame_len(&self) -> Option<usize> {
63        self.num_samples
64    }
65
66    #[inline]
67    fn channels(&self) -> u16 {
68        self.channels
69    }
70
71    #[inline]
72    fn sample_rate(&self) -> u32 {
73        self.sample_rate
74    }
75
76    #[inline]
77    fn total_duration(&self) -> Option<Duration> {
78        None
79    }
80}