geng_rodio/source/
zero.rs1use std::marker::PhantomData;
2use std::time::Duration;
3
4use crate::{Sample, Source};
5
6#[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}