1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use std::time::Duration;
use Sample;
pub use self::amplify::Amplify;
pub use self::buffered::Buffered;
pub use self::delay::Delay;
pub use self::fadein::FadeIn;
pub use self::mix::Mix;
pub use self::repeat::Repeat;
pub use self::sine::SineWave;
pub use self::speed::Speed;
pub use self::take::TakeDuration;
pub use self::uniform::UniformSourceIterator;
mod amplify;
mod buffered;
mod delay;
mod fadein;
mod mix;
mod repeat;
mod sine;
mod speed;
mod take;
mod uniform;
pub trait Source: Iterator where Self::Item: Sample {
fn get_current_frame_len(&self) -> Option<usize>;
fn get_channels(&self) -> u16;
fn get_samples_rate(&self) -> u32;
fn get_total_duration(&self) -> Option<Duration>;
#[inline]
fn buffered(self) -> Buffered<Self> where Self: Sized {
buffered::buffered(self)
}
#[inline]
fn mix<S>(self, other: S) -> Mix<Self, S> where Self: Sized, S: Source, S::Item: Sample {
mix::mix(self, other)
}
#[inline]
fn repeat_infinite(self) -> Repeat<Self> where Self: Sized {
repeat::repeat(self)
}
#[inline]
fn take_duration(self, duration: Duration) -> TakeDuration<Self> where Self: Sized {
take::take_duration(self, duration)
}
#[inline]
fn delay(self, duration: Duration) -> Delay<Self> where Self: Sized {
delay::delay(self, duration)
}
#[inline]
fn amplify(self, value: f32) -> Amplify<Self> where Self: Sized {
amplify::amplify(self, value)
}
#[inline]
fn fade_in(self, duration: Duration) -> FadeIn<Self> where Self: Sized {
fadein::fadein(self, duration)
}
#[inline]
fn speed(self, ratio: f32) -> Speed<Self> where Self: Sized {
speed::speed(self, ratio)
}
#[inline]
fn reverb(self, duration: Duration, amplitude: f32) -> Mix<Self, Delay<Amplify<Self>>>
where Self: Sized + Clone
{
let echo = self.clone().amplify(amplitude).delay(duration);
self.mix(echo)
}
}