Skip to main content

rodio/source/
triangle.rs

1use crate::common::{ChannelCount, SampleRate};
2use crate::math::nz;
3use crate::source::{Function, SignalGenerator};
4use crate::{Sample, Source};
5use std::time::Duration;
6
7use super::SeekError;
8
9/// An infinite source that produces a triangle wave.
10///
11/// Always has a sample rate of 48kHz and one channel.
12///
13/// This source is a thin interface on top of `SignalGenerator` provided for
14/// your convenience.
15#[derive(Clone, Debug)]
16pub struct TriangleWave {
17    test_tri: SignalGenerator,
18}
19
20impl TriangleWave {
21    const SAMPLE_RATE: SampleRate = nz!(48000);
22
23    /// The frequency of the sine.
24    #[inline]
25    pub fn new(freq: f32) -> TriangleWave {
26        TriangleWave {
27            test_tri: SignalGenerator::new(Self::SAMPLE_RATE, freq, Function::Triangle),
28        }
29    }
30}
31
32impl Iterator for TriangleWave {
33    type Item = Sample;
34
35    #[inline]
36    fn next(&mut self) -> Option<Sample> {
37        self.test_tri.next()
38    }
39}
40
41impl Source for TriangleWave {
42    #[inline]
43    fn current_span_len(&self) -> Option<usize> {
44        None
45    }
46
47    #[inline]
48    fn channels(&self) -> ChannelCount {
49        nz!(1)
50    }
51
52    #[inline]
53    fn sample_rate(&self) -> SampleRate {
54        Self::SAMPLE_RATE
55    }
56
57    #[inline]
58    fn total_duration(&self) -> Option<Duration> {
59        None
60    }
61
62    #[inline]
63    fn try_seek(&mut self, duration: Duration) -> Result<(), SeekError> {
64        self.test_tri.try_seek(duration)
65    }
66}