1
- use std:: mem;
1
+ use std:: { mem, ops :: Deref } ;
2
2
3
3
/// Format that each sample has.
4
4
#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
@@ -39,7 +39,7 @@ pub unsafe trait Sample: Copy + Clone {
39
39
/// Converts this sample into a standard i16 sample.
40
40
fn to_i16 ( & self ) -> i16 ;
41
41
/// Converts this sample into a 24 bit integer stored in an i32.
42
- fn to_i24 ( & self ) -> Padded24 ;
42
+ fn to_i24 ( & self ) -> Unpacked24 ;
43
43
/// Converts this sample into a standard i32 sample.
44
44
fn to_i32 ( & self ) -> i32 ;
45
45
@@ -71,7 +71,7 @@ unsafe impl Sample for u16 {
71
71
}
72
72
}
73
73
74
- fn to_i24 ( & self ) -> Padded24 {
74
+ fn to_i24 ( & self ) -> Unpacked24 {
75
75
self . to_f32 ( ) . to_i24 ( )
76
76
}
77
77
@@ -116,7 +116,7 @@ unsafe impl Sample for i16 {
116
116
}
117
117
118
118
#[ inline]
119
- fn to_i24 ( & self ) -> Padded24 {
119
+ fn to_i24 ( & self ) -> Unpacked24 {
120
120
self . to_f32 ( ) . to_i24 ( )
121
121
}
122
122
@@ -160,14 +160,14 @@ unsafe impl Sample for f32 {
160
160
161
161
/// This function inherently returns a lossy value due to scaling.
162
162
#[ inline]
163
- fn to_i24 ( & self ) -> Padded24 {
163
+ fn to_i24 ( & self ) -> Unpacked24 {
164
164
let result: f32 ;
165
165
if self . is_sign_positive ( ) {
166
- result = self * Padded24 :: MAX as f32 ;
166
+ result = self * Unpacked24 :: MAX as f32 ;
167
167
} else {
168
- result = self . abs ( ) * Padded24 :: MIN as f32 ;
168
+ result = self . abs ( ) * Unpacked24 :: MIN as f32 ;
169
169
}
170
- Padded24 ( result. round ( ) as i32 )
170
+ Unpacked24 ( result. round ( ) as i32 )
171
171
}
172
172
173
173
#[ inline]
@@ -188,16 +188,16 @@ unsafe impl Sample for f32 {
188
188
}
189
189
}
190
190
191
- #[ derive( Copy , Clone ) ]
192
- pub struct Padded24 ( i32 ) ;
191
+ #[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
192
+ pub struct Unpacked24 ( i32 ) ;
193
193
194
- impl Padded24 {
194
+ impl Unpacked24 {
195
195
const MAX : i32 = 8_388_607 ;
196
196
const MIN : i32 = -8_388_608 ;
197
197
198
198
// assumes i24 has been correctly parsed already
199
199
pub fn new ( val : i32 ) -> Self {
200
- Padded24 ( val)
200
+ Unpacked24 ( val)
201
201
}
202
202
203
203
pub fn from_be_bytes ( b : [ u8 ; 3 ] ) -> Self {
@@ -209,7 +209,7 @@ impl Padded24 {
209
209
extra_byte = u8:: MAX ;
210
210
}
211
211
212
- Padded24 ( i32:: from_be_bytes ( [ extra_byte, b[ 0 ] , b[ 1 ] , b[ 2 ] ] ) )
212
+ Unpacked24 ( i32:: from_be_bytes ( [ extra_byte, b[ 0 ] , b[ 1 ] , b[ 2 ] ] ) )
213
213
}
214
214
215
215
pub fn to_be_bytes ( & self ) -> [ u8 ; 3 ] {
@@ -231,7 +231,7 @@ impl Padded24 {
231
231
extra_byte = u8:: MAX ;
232
232
}
233
233
234
- Padded24 ( i32:: from_le_bytes ( [ b[ 0 ] , b[ 1 ] , b[ 2 ] , extra_byte] ) )
234
+ Unpacked24 ( i32:: from_le_bytes ( [ b[ 0 ] , b[ 1 ] , b[ 2 ] , extra_byte] ) )
235
235
}
236
236
237
237
pub fn to_le_bytes ( & self ) -> [ u8 ; 3 ] {
@@ -245,7 +245,37 @@ impl Padded24 {
245
245
}
246
246
}
247
247
248
- unsafe impl Sample for Padded24 {
248
+ impl PartialEq < i8 > for Unpacked24 {
249
+ fn eq ( & self , other : & i8 ) -> bool {
250
+ * other as i32 == self . 0
251
+ }
252
+ }
253
+
254
+ impl PartialEq < i16 > for Unpacked24 {
255
+ fn eq ( & self , other : & i16 ) -> bool {
256
+ * other as i32 == self . 0
257
+ }
258
+ }
259
+
260
+ impl PartialEq < i32 > for Unpacked24 {
261
+ fn eq ( & self , other : & i32 ) -> bool {
262
+ * other == self . 0
263
+ }
264
+ }
265
+
266
+ impl PartialEq < u8 > for Unpacked24 {
267
+ fn eq ( & self , other : & u8 ) -> bool {
268
+ * other as i32 == self . 0
269
+ }
270
+ }
271
+
272
+ impl PartialEq < u16 > for Unpacked24 {
273
+ fn eq ( & self , other : & u16 ) -> bool {
274
+ * other as i32 == self . 0
275
+ }
276
+ }
277
+
278
+ unsafe impl Sample for Unpacked24 {
249
279
const FORMAT : SampleFormat = SampleFormat :: I24 ;
250
280
251
281
#[ inline]
@@ -270,7 +300,7 @@ unsafe impl Sample for Padded24 {
270
300
}
271
301
272
302
#[ inline]
273
- fn to_i24 ( & self ) -> Padded24 {
303
+ fn to_i24 ( & self ) -> Unpacked24 {
274
304
* self
275
305
}
276
306
@@ -315,7 +345,7 @@ unsafe impl Sample for i32 {
315
345
316
346
/// This function inherently returns a lossy value due to scaling.
317
347
#[ inline]
318
- fn to_i24 ( & self ) -> Padded24 {
348
+ fn to_i24 ( & self ) -> Unpacked24 {
319
349
self . to_f32 ( ) . to_i24 ( )
320
350
}
321
351
@@ -333,62 +363,57 @@ unsafe impl Sample for i32 {
333
363
}
334
364
}
335
365
336
- // TODO add _to_i24 tests
337
-
338
366
#[ cfg( test) ]
339
367
mod test {
340
- use super :: { Sample , Padded24 } ;
368
+ use super :: { Sample , Unpacked24 } ;
341
369
342
370
#[ test]
343
371
fn i24_to_i16 ( ) {
344
- assert_eq ! ( Padded24 :: new( Padded24 :: MAX ) . to_i16( ) , std:: i16 :: MAX ) ;
345
- assert_eq ! ( Padded24 :: new( Padded24 :: MIN / 2 ) . to_i16( ) , std:: i16 :: MIN / 2 ) ;
346
- assert_eq ! ( Padded24 :: new( Padded24 :: MIN ) . to_i16( ) , std:: i16 :: MIN ) ;
347
- assert_eq ! ( Padded24 :: new( 0 ) . to_i16( ) , 0 ) ;
372
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MAX ) . to_i16( ) , std:: i16 :: MAX ) ;
373
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MIN / 2 ) . to_i16( ) , std:: i16 :: MIN / 2 ) ;
374
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MIN ) . to_i16( ) , std:: i16 :: MIN ) ;
375
+ assert_eq ! ( Unpacked24 :: new( 0 ) . to_i16( ) , 0 ) ;
348
376
}
349
377
350
378
#[ test]
351
379
fn i24_to_i24 ( ) {
352
- // let max = Padded24::new(Padded24::MAX);
353
- // let min = Padded24::new(Padded24::MIN);
354
-
355
- // assert_eq!(max.to_i16(), std::i16::MAX);
356
- // assert_eq!((std::i32::MIN / 2).to_i16(), std::i16::MIN / 2);
357
- // assert_eq!(std::i32::MIN.to_i16(), std::i16::MIN);
358
- // assert_eq!(0i32.to_i16(), 0);
380
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MAX ) . to_i24( ) , Unpacked24 :: MAX ) ;
381
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MIN / 2 ) . to_i24( ) , Unpacked24 :: MIN / 2 ) ;
382
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MIN ) . to_i24( ) , Unpacked24 :: MIN ) ;
383
+ assert_eq ! ( Unpacked24 :: new( 0 ) . to_i24( ) , 0i32 ) ;
359
384
}
360
385
361
386
362
387
#[ test]
363
388
fn i24_to_i32 ( ) {
364
- assert_eq ! ( Padded24 :: new( Padded24 :: MAX ) . to_i32( ) , std:: i32 :: MAX ) ;
365
- assert_eq ! ( Padded24 :: new( Padded24 :: MIN / 2 ) . to_i32( ) , std:: i32 :: MIN / 2 ) ;
366
- assert_eq ! ( Padded24 :: new( Padded24 :: MIN ) . to_i32( ) , std:: i32 :: MIN ) ;
367
- assert_eq ! ( Padded24 :: new( 0 ) . to_i32( ) , 0 ) ;
389
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MAX ) . to_i32( ) , std:: i32 :: MAX ) ;
390
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MIN / 2 ) . to_i32( ) , std:: i32 :: MIN / 2 ) ;
391
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MIN ) . to_i32( ) , std:: i32 :: MIN ) ;
392
+ assert_eq ! ( Unpacked24 :: new( 0 ) . to_i32( ) , 0 ) ;
368
393
}
369
394
370
395
#[ test]
371
396
fn i24_to_u16 ( ) {
372
- assert_eq ! ( Padded24 :: new( Padded24 :: MAX ) . to_u16( ) , std:: u16 :: MAX ) ;
397
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MAX ) . to_u16( ) , std:: u16 :: MAX ) ;
373
398
// half of the int max will be 3/4 of the uint max
374
399
assert_eq ! (
375
- Padded24 :: new( Padded24 :: MAX / 2 ) . to_u16( ) ,
400
+ Unpacked24 :: new( Unpacked24 :: MAX / 2 ) . to_u16( ) ,
376
401
( std:: u16 :: MAX as f32 / 4.0 * 3.0 ) . round( ) as u16
377
402
) ;
378
- assert_eq ! ( Padded24 :: new( Padded24 :: MIN ) . to_u16( ) , std:: u16 :: MIN ) ;
403
+ assert_eq ! ( Unpacked24 :: new( Unpacked24 :: MIN ) . to_u16( ) , std:: u16 :: MIN ) ;
379
404
}
380
405
381
406
#[ test]
382
407
fn i24_to_f32 ( ) {
383
- let max = Padded24 :: new ( Padded24 :: MAX ) ;
384
- let min = Padded24 :: new ( Padded24 :: MIN ) ;
408
+ let max = Unpacked24 :: new ( Unpacked24 :: MAX ) ;
409
+ let min = Unpacked24 :: new ( Unpacked24 :: MIN ) ;
385
410
386
411
assert_eq ! ( max. to_f32( ) , 1.0f32 ) ;
387
412
assert_eq ! ( max. to_f32( ) / 8.0 , 0.125f32 ) ;
388
413
assert_eq ! ( max. to_f32( ) / -16.0 , -0.0625f32 ) ;
389
414
assert_eq ! ( max. to_f32( ) / -4.0 , -0.25f32 ) ;
390
415
assert_eq ! ( min. to_f32( ) , -1.0f32 ) ;
391
- assert_eq ! ( Padded24 :: new( 0 ) . to_f32( ) , 0f32 ) ;
416
+ assert_eq ! ( Unpacked24 :: new( 0 ) . to_f32( ) , 0f32 ) ;
392
417
}
393
418
394
419
#[ test]
@@ -399,6 +424,14 @@ mod test {
399
424
assert_eq ! ( 0i32 . to_i16( ) , 0 ) ;
400
425
}
401
426
427
+ #[ test]
428
+ fn i32_to_i24 ( ) {
429
+ assert_eq ! ( std:: i32 :: MAX . to_i24( ) , Unpacked24 :: MAX ) ;
430
+ assert_eq ! ( ( std:: i32 :: MIN / 2 ) . to_i24( ) , Unpacked24 :: MIN / 2 ) ;
431
+ assert_eq ! ( std:: i32 :: MIN . to_i24( ) , Unpacked24 :: MIN ) ;
432
+ assert_eq ! ( 0i32 . to_i24( ) , Unpacked24 :: new( 0 ) ) ;
433
+ }
434
+
402
435
#[ test]
403
436
fn i32_to_i32 ( ) {
404
437
assert_eq ! ( std:: i32 :: MAX . to_i32( ) , std:: i32 :: MAX ) ;
@@ -434,6 +467,12 @@ mod test {
434
467
assert_eq ! ( 32767i16 . to_i16( ) , 32767 ) ;
435
468
assert_eq ! ( ( -32768i16 ) . to_i16( ) , -32768 ) ;
436
469
}
470
+ #[ test]
471
+ fn i16_to_i24 ( ) {
472
+ assert_eq ! ( 0i16 . to_i24( ) , 0i32 ) ;
473
+ assert_eq ! ( i16 :: MIN . to_i24( ) , Unpacked24 :: MIN ) ;
474
+ assert_eq ! ( i16 :: MAX . to_i24( ) , Unpacked24 :: MAX ) ;
475
+ }
437
476
438
477
#[ test]
439
478
fn i16_to_i32 ( ) {
@@ -467,6 +506,14 @@ mod test {
467
506
assert_eq ! ( 0u16 . to_i16( ) , -32768 ) ;
468
507
}
469
508
509
+ #[ test]
510
+ fn u16_to_i24 ( ) {
511
+ assert_eq ! ( u16 :: MAX . to_i24( ) , Unpacked24 :: MAX ) ;
512
+ assert_eq ! ( u16 :: MIN . to_i24( ) , Unpacked24 :: MIN ) ;
513
+ assert_eq ! ( 32768u16 . to_i24( ) , 0i32 ) ;
514
+ assert_eq ! ( 16384u16 . to_i24( ) , Unpacked24 :: MIN / 2 ) ;
515
+ }
516
+
470
517
#[ test]
471
518
fn u16_to_i32 ( ) {
472
519
assert_eq ! ( ( ( std:: u16 :: MAX as f32 / 2.0 ) . round( ) as u16 ) . to_i32( ) , 0 ) ;
@@ -497,6 +544,15 @@ mod test {
497
544
assert_eq ! ( ( -1.0f32 ) . to_i16( ) , :: std:: i16 :: MIN ) ;
498
545
}
499
546
547
+ #[ test]
548
+ fn f32_to_i24 ( ) {
549
+ assert_eq ! ( 1.0f32 . to_i24( ) , Unpacked24 :: MAX ) ;
550
+ assert_eq ! ( ( 0.5f32 ) . to_i24( ) , ( Unpacked24 :: MAX as f32 / 2.0 ) . round( ) as i32 ) ;
551
+ assert_eq ! ( 0.0f32 . to_i24( ) , 0i32 ) ;
552
+ assert_eq ! ( ( -0.5f32 ) . to_i24( ) , Unpacked24 :: MIN / 2 ) ;
553
+ assert_eq ! ( ( -1.0f32 ) . to_i24( ) , Unpacked24 :: MIN ) ;
554
+ }
555
+
500
556
#[ test]
501
557
fn f32_to_i32 ( ) {
502
558
assert_eq ! ( 1.0f32 . to_i32( ) , std:: i32 :: MAX ) ;
0 commit comments