1use std::time::Duration;
2
3use super::SeekError;
4use crate::common::{ChannelCount, SampleRate};
5use crate::{Sample, Source};
6
7#[derive(Clone, Debug)]
11pub struct Zero {
12 channels: ChannelCount,
13 sample_rate: SampleRate,
14 num_samples: Option<usize>,
15}
16
17impl Zero {
18 #[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 #[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}