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#[derive(Clone, Debug)]
16pub struct TriangleWave {
17 test_tri: SignalGenerator,
18}
19
20impl TriangleWave {
21 const SAMPLE_RATE: SampleRate = nz!(48000);
22
23 #[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}