1use crate::common::{ChannelCount, SampleRate};
2use crate::source::{Function, SignalGenerator};
3use crate::Source;
4use std::time::Duration;
5
6use super::SeekError;
7
8#[derive(Clone, Debug)]
15pub struct SineWave {
16 test_sine: SignalGenerator,
17}
18
19impl SineWave {
20 const SAMPLE_RATE: u32 = 48000;
21
22 #[inline]
24 pub fn new(freq: f32) -> SineWave {
25 SineWave {
26 test_sine: SignalGenerator::new(Self::SAMPLE_RATE, freq, Function::Sine),
27 }
28 }
29}
30
31impl Iterator for SineWave {
32 type Item = f32;
33
34 #[inline]
35 fn next(&mut self) -> Option<f32> {
36 self.test_sine.next()
37 }
38}
39
40impl Source for SineWave {
41 #[inline]
42 fn current_span_len(&self) -> Option<usize> {
43 None
44 }
45
46 #[inline]
47 fn channels(&self) -> ChannelCount {
48 1
49 }
50
51 #[inline]
52 fn sample_rate(&self) -> SampleRate {
53 Self::SAMPLE_RATE
54 }
55
56 #[inline]
57 fn total_duration(&self) -> Option<Duration> {
58 None
59 }
60
61 #[inline]
62 fn try_seek(&mut self, duration: Duration) -> Result<(), SeekError> {
63 self.test_sine.try_seek(duration)
64 }
65}