19
19
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
20
// THE SOFTWARE.
21
21
22
+ use dasp_frame:: Frame ;
23
+
22
24
/// Convert linear energy to logarithmic loudness.
23
25
pub fn energy_to_loudness ( energy : f64 ) -> f64 {
24
26
// The non-test version is faster and more accurate but gives
@@ -35,11 +37,11 @@ pub fn energy_to_loudness(energy: f64) -> f64 {
35
37
}
36
38
37
39
/// Trait for abstracting over interleaved and planar samples.
38
- pub trait Samples < ' a , T : ' a > : Sized {
40
+ pub trait Samples < ' a , S : Sample + ' a > : Sized {
39
41
/// Call the given closure for each sample of the given channel.
40
42
// FIXME: Workaround for TrustedLen / TrustedRandomAccess being unstable
41
43
// and because of that we wouldn't get nice optimizations
42
- fn foreach_sample ( & self , channel : usize , func : impl FnMut ( & ' a T ) ) ;
44
+ fn foreach_sample ( & self , channel : usize , func : impl FnMut ( & ' a S ) ) ;
43
45
44
46
/// Call the given closure for each sample of the given channel.
45
47
// FIXME: Workaround for TrustedLen / TrustedRandomAccess being unstable
@@ -48,9 +50,11 @@ pub trait Samples<'a, T: 'a>: Sized {
48
50
& self ,
49
51
channel : usize ,
50
52
iter : impl Iterator < Item = U > ,
51
- func : impl FnMut ( & ' a T , U ) ,
53
+ func : impl FnMut ( & ' a S , U ) ,
52
54
) ;
53
55
56
+ fn foreach_frame < F : Frame < Sample = S > > ( & self , func : impl FnMut ( F ) ) ;
57
+
54
58
/// Number of frames.
55
59
fn frames ( & self ) -> usize ;
56
60
@@ -62,16 +66,16 @@ pub trait Samples<'a, T: 'a>: Sized {
62
66
}
63
67
64
68
/// Struct representing interleaved samples.
65
- pub struct Interleaved < ' a , T > {
69
+ pub struct Interleaved < ' a , S > {
66
70
/// Interleaved sample data.
67
- data : & ' a [ T ] ,
71
+ data : & ' a [ S ] ,
68
72
/// Number of channels.
69
73
channels : usize ,
70
74
}
71
75
72
- impl < ' a , T > Interleaved < ' a , T > {
76
+ impl < ' a , S > Interleaved < ' a , S > {
73
77
/// Create a new wrapper around the interleaved channels and do a sanity check.
74
- pub fn new ( data : & ' a [ T ] , channels : usize ) -> Result < Self , crate :: Error > {
78
+ pub fn new ( data : & ' a [ S ] , channels : usize ) -> Result < Self , crate :: Error > {
75
79
if channels == 0 {
76
80
return Err ( crate :: Error :: NoMem ) ;
77
81
}
@@ -84,9 +88,9 @@ impl<'a, T> Interleaved<'a, T> {
84
88
}
85
89
}
86
90
87
- impl < ' a , T > Samples < ' a , T > for Interleaved < ' a , T > {
91
+ impl < ' a , S : Sample > Samples < ' a , S > for Interleaved < ' a , S > {
88
92
#[ inline]
89
- fn foreach_sample ( & self , channel : usize , mut func : impl FnMut ( & ' a T ) ) {
93
+ fn foreach_sample ( & self , channel : usize , mut func : impl FnMut ( & ' a S ) ) {
90
94
assert ! ( channel < self . channels) ;
91
95
92
96
for v in self . data . chunks_exact ( self . channels ) {
@@ -99,7 +103,7 @@ impl<'a, T> Samples<'a, T> for Interleaved<'a, T> {
99
103
& self ,
100
104
channel : usize ,
101
105
iter : impl Iterator < Item = U > ,
102
- mut func : impl FnMut ( & ' a T , U ) ,
106
+ mut func : impl FnMut ( & ' a S , U ) ,
103
107
) {
104
108
assert ! ( channel < self . channels) ;
105
109
@@ -108,6 +112,14 @@ impl<'a, T> Samples<'a, T> for Interleaved<'a, T> {
108
112
}
109
113
}
110
114
115
+ #[ inline]
116
+ fn foreach_frame < F : Frame < Sample = S > > ( & self , mut func : impl FnMut ( F ) ) {
117
+ assert_eq ! ( F :: CHANNELS , self . channels) ;
118
+ for f in self . data . chunks_exact ( self . channels ) {
119
+ func ( F :: from_samples ( & mut f. iter ( ) . copied ( ) ) . unwrap ( ) ) ;
120
+ }
121
+ }
122
+
111
123
#[ inline]
112
124
fn frames ( & self ) -> usize {
113
125
self . data . len ( ) / self . channels
@@ -137,15 +149,15 @@ impl<'a, T> Samples<'a, T> for Interleaved<'a, T> {
137
149
}
138
150
139
151
/// Struct representing interleaved samples.
140
- pub struct Planar < ' a , T > {
141
- data : & ' a [ & ' a [ T ] ] ,
152
+ pub struct Planar < ' a , S > {
153
+ data : & ' a [ & ' a [ S ] ] ,
142
154
start : usize ,
143
155
end : usize ,
144
156
}
145
157
146
- impl < ' a , T > Planar < ' a , T > {
158
+ impl < ' a , S > Planar < ' a , S > {
147
159
/// Create a new wrapper around the planar channels and do a sanity check.
148
- pub fn new ( data : & ' a [ & ' a [ T ] ] ) -> Result < Self , crate :: Error > {
160
+ pub fn new ( data : & ' a [ & ' a [ S ] ] ) -> Result < Self , crate :: Error > {
149
161
if data. is_empty ( ) {
150
162
return Err ( crate :: Error :: NoMem ) ;
151
163
}
@@ -162,9 +174,9 @@ impl<'a, T> Planar<'a, T> {
162
174
}
163
175
}
164
176
165
- impl < ' a , T > Samples < ' a , T > for Planar < ' a , T > {
177
+ impl < ' a , S : Sample > Samples < ' a , S > for Planar < ' a , S > {
166
178
#[ inline]
167
- fn foreach_sample ( & self , channel : usize , mut func : impl FnMut ( & ' a T ) ) {
179
+ fn foreach_sample ( & self , channel : usize , mut func : impl FnMut ( & ' a S ) ) {
168
180
assert ! ( channel < self . data. len( ) ) ;
169
181
170
182
for v in & self . data [ channel] [ self . start ..self . end ] {
@@ -177,7 +189,7 @@ impl<'a, T> Samples<'a, T> for Planar<'a, T> {
177
189
& self ,
178
190
channel : usize ,
179
191
iter : impl Iterator < Item = U > ,
180
- mut func : impl FnMut ( & ' a T , U ) ,
192
+ mut func : impl FnMut ( & ' a S , U ) ,
181
193
) {
182
194
assert ! ( channel < self . data. len( ) ) ;
183
195
@@ -186,6 +198,15 @@ impl<'a, T> Samples<'a, T> for Planar<'a, T> {
186
198
}
187
199
}
188
200
201
+ #[ inline]
202
+ fn foreach_frame < F : Frame < Sample = S > > ( & self , mut func : impl FnMut ( F ) ) {
203
+ let channels = self . data . len ( ) ;
204
+ assert_eq ! ( F :: CHANNELS , channels) ;
205
+ for f in self . start ..self . end {
206
+ func ( F :: from_fn ( |c| self . data [ c] [ f] ) ) ;
207
+ }
208
+ }
209
+
189
210
#[ inline]
190
211
fn frames ( & self ) -> usize {
191
212
self . end - self . start
@@ -261,13 +282,13 @@ pub mod tests {
261
282
use dasp_sample:: { FromSample , Sample } ;
262
283
263
284
#[ derive( Clone , Debug ) ]
264
- pub struct Signal < T : FromSample < f32 > > {
265
- pub data : Vec < T > ,
285
+ pub struct Signal < S : FromSample < f32 > > {
286
+ pub data : Vec < S > ,
266
287
pub channels : u32 ,
267
288
pub rate : u32 ,
268
289
}
269
290
270
- impl < T : Sample + FromSample < f32 > + quickcheck:: Arbitrary > quickcheck:: Arbitrary for Signal < T > {
291
+ impl < S : Sample + FromSample < f32 > + quickcheck:: Arbitrary > quickcheck:: Arbitrary for Signal < S > {
271
292
fn arbitrary < G : quickcheck:: Gen > ( g : & mut G ) -> Self {
272
293
use rand:: Rng ;
273
294
@@ -297,7 +318,7 @@ pub mod tests {
297
318
2.0 * std:: f32:: consts:: PI * freqs[ 3 ] / rate as f32 ,
298
319
] ;
299
320
300
- let mut data = vec ! [ T :: from_sample( 0.0f32 ) ; num_frames * channels as usize ] ;
321
+ let mut data = vec ! [ S :: from_sample( 0.0f32 ) ; num_frames * channels as usize ] ;
301
322
for frame in data. chunks_exact_mut ( channels as usize ) {
302
323
let val = max
303
324
* ( f32:: sin ( accumulators[ 0 ] ) * volumes[ 0 ]
@@ -307,7 +328,7 @@ pub mod tests {
307
328
/ volume_scale;
308
329
309
330
for sample in frame. iter_mut ( ) {
310
- * sample = T :: from_sample ( val) ;
331
+ * sample = S :: from_sample ( val) ;
311
332
}
312
333
313
334
for ( acc, step) in accumulators. iter_mut ( ) . zip ( steps. iter ( ) ) {
0 commit comments