geng_rodio/source/
amplify.rs

1use std::time::Duration;
2
3use crate::{Sample, Source};
4
5/// Internal function that builds a `Amplify` object.
6pub fn amplify<I>(input: I, factor: f32) -> Amplify<I>
7where
8    I: Source,
9    I::Item: Sample,
10{
11    Amplify { input, factor }
12}
13
14/// Filter that modifies each sample by a given value.
15#[derive(Clone, Debug)]
16pub struct Amplify<I> {
17    input: I,
18    factor: f32,
19}
20
21impl<I> Amplify<I> {
22    /// Modifies the amplification factor.
23    #[inline]
24    pub fn set_factor(&mut self, factor: f32) {
25        self.factor = factor;
26    }
27
28    /// Returns a reference to the inner source.
29    #[inline]
30    pub fn inner(&self) -> &I {
31        &self.input
32    }
33
34    /// Returns a mutable reference to the inner source.
35    #[inline]
36    pub fn inner_mut(&mut self) -> &mut I {
37        &mut self.input
38    }
39
40    /// Returns the inner source.
41    #[inline]
42    pub fn into_inner(self) -> I {
43        self.input
44    }
45}
46
47impl<I> Iterator for Amplify<I>
48where
49    I: Source,
50    I::Item: Sample,
51{
52    type Item = I::Item;
53
54    #[inline]
55    fn next(&mut self) -> Option<I::Item> {
56        self.input.next().map(|value| value.amplify(self.factor))
57    }
58
59    #[inline]
60    fn size_hint(&self) -> (usize, Option<usize>) {
61        self.input.size_hint()
62    }
63}
64
65impl<I> ExactSizeIterator for Amplify<I>
66where
67    I: Source + ExactSizeIterator,
68    I::Item: Sample,
69{
70}
71
72impl<I> Source for Amplify<I>
73where
74    I: Source,
75    I::Item: Sample,
76{
77    #[inline]
78    fn current_frame_len(&self) -> Option<usize> {
79        self.input.current_frame_len()
80    }
81
82    #[inline]
83    fn channels(&self) -> u16 {
84        self.input.channels()
85    }
86
87    #[inline]
88    fn sample_rate(&self) -> u32 {
89        self.input.sample_rate()
90    }
91
92    #[inline]
93    fn total_duration(&self) -> Option<Duration> {
94        self.input.total_duration()
95    }
96}