Skip to content

Commit 260eec9

Browse files
committed
add i24 tests
rename 24bit impl
1 parent 131cb84 commit 260eec9

File tree

2 files changed

+98
-42
lines changed

2 files changed

+98
-42
lines changed

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ pub use platform::{
159159
available_hosts, default_host, host_from_id, Device, Devices, Host, HostId, Stream,
160160
SupportedInputConfigs, SupportedOutputConfigs, ALL_HOSTS,
161161
};
162-
pub use samples_formats::{Sample, SampleFormat, Padded24};
162+
pub use samples_formats::{Sample, SampleFormat, Unpacked24};
163163
use std::convert::TryInto;
164164
use std::ops::{Div, Mul};
165165
use std::time::Duration;

src/samples_formats.rs

Lines changed: 97 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::mem;
1+
use std::{mem, ops::Deref};
22

33
/// Format that each sample has.
44
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
@@ -39,7 +39,7 @@ pub unsafe trait Sample: Copy + Clone {
3939
/// Converts this sample into a standard i16 sample.
4040
fn to_i16(&self) -> i16;
4141
/// Converts this sample into a 24 bit integer stored in an i32.
42-
fn to_i24(&self) -> Padded24;
42+
fn to_i24(&self) -> Unpacked24;
4343
/// Converts this sample into a standard i32 sample.
4444
fn to_i32(&self) -> i32;
4545

@@ -71,7 +71,7 @@ unsafe impl Sample for u16 {
7171
}
7272
}
7373

74-
fn to_i24(&self) -> Padded24 {
74+
fn to_i24(&self) -> Unpacked24 {
7575
self.to_f32().to_i24()
7676
}
7777

@@ -116,7 +116,7 @@ unsafe impl Sample for i16 {
116116
}
117117

118118
#[inline]
119-
fn to_i24(&self) -> Padded24 {
119+
fn to_i24(&self) -> Unpacked24 {
120120
self.to_f32().to_i24()
121121
}
122122

@@ -160,14 +160,14 @@ unsafe impl Sample for f32 {
160160

161161
/// This function inherently returns a lossy value due to scaling.
162162
#[inline]
163-
fn to_i24(&self) -> Padded24 {
163+
fn to_i24(&self) -> Unpacked24 {
164164
let result: f32;
165165
if self.is_sign_positive() {
166-
result = self * Padded24::MAX as f32;
166+
result = self * Unpacked24::MAX as f32;
167167
} else {
168-
result = self.abs() * Padded24::MIN as f32;
168+
result = self.abs() * Unpacked24::MIN as f32;
169169
}
170-
Padded24(result.round() as i32)
170+
Unpacked24(result.round() as i32)
171171
}
172172

173173
#[inline]
@@ -188,16 +188,16 @@ unsafe impl Sample for f32 {
188188
}
189189
}
190190

191-
#[derive(Copy, Clone)]
192-
pub struct Padded24(i32);
191+
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
192+
pub struct Unpacked24(i32);
193193

194-
impl Padded24 {
194+
impl Unpacked24 {
195195
const MAX: i32 = 8_388_607;
196196
const MIN: i32 = -8_388_608;
197197

198198
// assumes i24 has been correctly parsed already
199199
pub fn new(val: i32) -> Self {
200-
Padded24(val)
200+
Unpacked24(val)
201201
}
202202

203203
pub fn from_be_bytes(b: [u8; 3]) -> Self {
@@ -209,7 +209,7 @@ impl Padded24 {
209209
extra_byte = u8::MAX;
210210
}
211211

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]]))
213213
}
214214

215215
pub fn to_be_bytes(&self) -> [u8; 3] {
@@ -231,7 +231,7 @@ impl Padded24 {
231231
extra_byte = u8::MAX;
232232
}
233233

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]))
235235
}
236236

237237
pub fn to_le_bytes(&self) -> [u8; 3] {
@@ -245,7 +245,37 @@ impl Padded24 {
245245
}
246246
}
247247

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 {
249279
const FORMAT: SampleFormat = SampleFormat::I24;
250280

251281
#[inline]
@@ -270,7 +300,7 @@ unsafe impl Sample for Padded24 {
270300
}
271301

272302
#[inline]
273-
fn to_i24(&self) -> Padded24 {
303+
fn to_i24(&self) -> Unpacked24 {
274304
*self
275305
}
276306

@@ -315,7 +345,7 @@ unsafe impl Sample for i32 {
315345

316346
/// This function inherently returns a lossy value due to scaling.
317347
#[inline]
318-
fn to_i24(&self) -> Padded24 {
348+
fn to_i24(&self) -> Unpacked24 {
319349
self.to_f32().to_i24()
320350
}
321351

@@ -333,62 +363,57 @@ unsafe impl Sample for i32 {
333363
}
334364
}
335365

336-
// TODO add _to_i24 tests
337-
338366
#[cfg(test)]
339367
mod test {
340-
use super::{Sample, Padded24};
368+
use super::{Sample, Unpacked24};
341369

342370
#[test]
343371
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);
348376
}
349377

350378
#[test]
351379
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);
359384
}
360385

361386

362387
#[test]
363388
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);
368393
}
369394

370395
#[test]
371396
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);
373398
// half of the int max will be 3/4 of the uint max
374399
assert_eq!(
375-
Padded24::new(Padded24::MAX / 2).to_u16(),
400+
Unpacked24::new(Unpacked24::MAX / 2).to_u16(),
376401
(std::u16::MAX as f32 / 4.0 * 3.0).round() as u16
377402
);
378-
assert_eq!(Padded24::new(Padded24::MIN).to_u16(), std::u16::MIN);
403+
assert_eq!(Unpacked24::new(Unpacked24::MIN).to_u16(), std::u16::MIN);
379404
}
380405

381406
#[test]
382407
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);
385410

386411
assert_eq!(max.to_f32(), 1.0f32);
387412
assert_eq!(max.to_f32() / 8.0, 0.125f32);
388413
assert_eq!(max.to_f32() / -16.0, -0.0625f32);
389414
assert_eq!(max.to_f32() / -4.0, -0.25f32);
390415
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);
392417
}
393418

394419
#[test]
@@ -399,6 +424,14 @@ mod test {
399424
assert_eq!(0i32.to_i16(), 0);
400425
}
401426

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+
402435
#[test]
403436
fn i32_to_i32() {
404437
assert_eq!(std::i32::MAX.to_i32(), std::i32::MAX);
@@ -434,6 +467,12 @@ mod test {
434467
assert_eq!(32767i16.to_i16(), 32767);
435468
assert_eq!((-32768i16).to_i16(), -32768);
436469
}
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+
}
437476

438477
#[test]
439478
fn i16_to_i32() {
@@ -467,6 +506,14 @@ mod test {
467506
assert_eq!(0u16.to_i16(), -32768);
468507
}
469508

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+
470517
#[test]
471518
fn u16_to_i32() {
472519
assert_eq!(((std::u16::MAX as f32 / 2.0).round() as u16).to_i32(), 0);
@@ -497,6 +544,15 @@ mod test {
497544
assert_eq!((-1.0f32).to_i16(), ::std::i16::MIN);
498545
}
499546

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+
500556
#[test]
501557
fn f32_to_i32() {
502558
assert_eq!(1.0f32.to_i32(), std::i32::MAX);

0 commit comments

Comments
 (0)