geng_rodio/source/
sine.rs

1use std::f32::consts::PI;
2use std::time::Duration;
3
4use crate::Source;
5
6/// An infinite source that produces a sine.
7///
8/// Always has a rate of 48kHz and one channel.
9#[derive(Clone, Debug)]
10pub struct SineWave {
11    freq: f32,
12    num_sample: usize,
13}
14
15impl SineWave {
16    /// The frequency of the sine.
17    #[inline]
18    pub fn new(freq: f32) -> SineWave {
19        SineWave {
20            freq: freq,
21            num_sample: 0,
22        }
23    }
24}
25
26impl Iterator for SineWave {
27    type Item = f32;
28
29    #[inline]
30    fn next(&mut self) -> Option<f32> {
31        self.num_sample = self.num_sample.wrapping_add(1);
32
33        let value = 2.0 * PI * self.freq * self.num_sample as f32 / 48000.0;
34        Some(value.sin())
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        48000
52    }
53
54    #[inline]
55    fn total_duration(&self) -> Option<Duration> {
56        None
57    }
58}