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