rodio/source/
zero.rs

1use std::time::Duration;
2
3use super::SeekError;
4use crate::common::{ChannelCount, SampleRate};
5use crate::{Sample, Source};
6
7/// An source that produces samples with value zero (silence). Depending on if
8/// it where created with [`Zero::new`] or [`Zero::new_samples`] it can be never
9/// ending or finite.
10#[derive(Clone, Debug)]
11pub struct Zero {
12    channels: ChannelCount,
13    sample_rate: SampleRate,
14    num_samples: Option<usize>,
15}
16
17impl Zero {
18    /// Create a new source that never ends and produces total silence.
19    #[inline]
20    pub fn new(channels: ChannelCount, sample_rate: SampleRate) -> Zero {
21        Zero {
22            channels,
23            sample_rate,
24            num_samples: None,
25        }
26    }
27    /// Create a new source that never ends and produces total silence.
28    #[inline]
29    pub fn new_samples(
30        channels: ChannelCount,
31        sample_rate: SampleRate,
32        num_samples: usize,
33    ) -> Zero {
34        Zero {
35            channels,
36            sample_rate,
37            num_samples: Some(num_samples),
38        }
39    }
40}
41
42impl Iterator for Zero {
43    type Item = Sample;
44
45    #[inline]
46    fn next(&mut self) -> Option<Self::Item> {
47        if let Some(num_samples) = self.num_samples {
48            if num_samples > 0 {
49                self.num_samples = Some(num_samples - 1);
50                Some(0.0)
51            } else {
52                None
53            }
54        } else {
55            Some(0.0)
56        }
57    }
58}
59
60impl Source for Zero {
61    #[inline]
62    fn current_span_len(&self) -> Option<usize> {
63        self.num_samples
64    }
65
66    #[inline]
67    fn channels(&self) -> ChannelCount {
68        self.channels
69    }
70
71    #[inline]
72    fn sample_rate(&self) -> SampleRate {
73        self.sample_rate
74    }
75
76    #[inline]
77    fn total_duration(&self) -> Option<Duration> {
78        None
79    }
80
81    #[inline]
82    fn try_seek(&mut self, _: Duration) -> Result<(), SeekError> {
83        Ok(())
84    }
85}