diff --git a/bingus/src/lib.rs b/bingus/src/lib.rs index 385b96b..40b6b78 100644 --- a/bingus/src/lib.rs +++ b/bingus/src/lib.rs @@ -1,66 +1,43 @@ use dasp_sample::{FromSample, Sample, U24, U48}; -pub trait AsSample +pub trait AsSample where - S: Sample, + Self: Sized, { - fn as_sample(self) -> S; -} - -impl AsSample for u8 -where - S: Sample + FromSample, -{ - fn as_sample(self) -> S { - self.to_sample() + fn _prepare(self) -> F; + fn as_sample>(self) -> S { + Sample::from_sample(self._prepare()) } } -impl AsSample for [u8; 2] -where - S: Sample + FromSample, -{ - fn as_sample(self) -> S { - (((self[0] as u16) << 8) | self[1] as u16).to_sample() +impl AsSample for u8 { + fn _prepare(self) -> u8 { + self } } -impl AsSample for [u8; 3] -where - S: Sample + FromSample, -{ - fn as_sample(self) -> S { - (((U24::from(self[0])) << 16.into()) - | (U24::from(self[1]) << 8.into()) - | U24::from(self[2])) - .to_sample() +impl AsSample for [u8; 2] { + fn _prepare(self) -> u16 { + ((self[0]._prepare() as u16) << 8) | self[1] as u16 } } -impl AsSample for [u8; 4] -where - S: Sample + FromSample, -{ - fn as_sample(self) -> S { - (((self[0] as u32) << 24) - | ((self[1] as u32) << 16) - | ((self[2] as u32) << 8) - | self[3] as u32) - .to_sample() +impl AsSample for [u8; 3] { + fn _prepare(self) -> U24 { + (U24::from([self[0], self[1]]._prepare()) << 8.into()) | U24::from(self[2]) } } -impl AsSample for [u8; 6] -where - S: Sample + FromSample, -{ - fn as_sample(self) -> S { - ((U48::from(self[0]) << 40u8.into()) - | (U48::from(self[1]) << 32u8.into()) - | (U48::from(self[2]) << 24u8.into()) - | (U48::from(self[3]) << 16u8.into()) - | (U48::from(self[4]) << 8u8.into()) - | U48::from(self[3])) - .to_sample() +impl AsSample for [u8; 4] { + fn _prepare(self) -> u32 { + (([self[0], self[1], self[2]]._prepare().inner() as u32) << 8) | self[3] as u32 + } +} + +impl AsSample for [u8; 6] { + fn _prepare(self) -> U48 { + ((U48::from([self[0], self[1], self[2], self[3]]._prepare()) << 16u8.into()) + | (U48::from(self[4]) << 8u8.into())) + | U48::from(self[5]) } }