rodio/source/
sine.rs

1use std::time::Duration;
2
3use crate::source::{Function, SignalGenerator};
4use crate::Source;
5
6use super::SeekError;
7
8/// An infinite source that produces a sine.
9///
10/// Always has a rate of 48kHz and one channel.
11#[derive(Clone, Debug)]
12pub struct SineWave {
13    test_sine: SignalGenerator,
14}
15
16impl SineWave {
17    const SAMPLE_RATE: u32 = 48000;
18
19    /// The frequency of the sine.
20    #[inline]
21    pub fn new(freq: f32) -> SineWave {
22        let sr = cpal::SampleRate(Self::SAMPLE_RATE);
23        SineWave {
24            test_sine: SignalGenerator::new(sr, freq, Function::Sine),
25        }
26    }
27}
28
29impl Iterator for SineWave {
30    type Item = f32;
31
32    #[inline]
33    fn next(&mut self) -> Option<f32> {
34        self.test_sine.next()
35    }
36}
37
38impl Source for SineWave {
39    #[inline]
40    fn current_frame_len(&self) -> Option<usize> {
41        None
42    }
43
44    #[inline]
45    fn channels(&self) -> u16 {
46        1
47    }
48
49    #[inline]
50    fn sample_rate(&self) -> u32 {
51        Self::SAMPLE_RATE
52    }
53
54    #[inline]
55    fn total_duration(&self) -> Option<Duration> {
56        None
57    }
58
59    /// `try_seek()` does nothing on the sine generator. If you need to
60    /// generate a sine tone with a precise phase or sample offset, consider
61    /// using `skip::skip_samples()`.
62    #[inline]
63    fn try_seek(&mut self, _: Duration) -> Result<(), SeekError> {
64        Ok(())
65    }
66}