fn cvt_from(val: u8) -> u8 { val }
}
impl FromFmt<u8> for i16 {
- fn cvt_from(val: u8) -> i16 { (i16::from(val) - 128).wrapping_mul(0x101) }
+ fn cvt_from(val: u8) -> i16 { u16::from(val ^ 0x80).wrapping_mul(0x101) as i16}
}
impl FromFmt<u8> for i32 {
- fn cvt_from(val: u8) -> i32 { (i32::from(val) - 128).wrapping_mul(0x01010101) }
+ fn cvt_from(val: u8) -> i32 { u32::from(val ^ 0x80).wrapping_mul(0x01010101) as i32 }
}
impl FromFmt<u8> for f32 {
fn cvt_from(val: u8) -> f32 { (f32::from(val) - 128.0) / 128.0 }
fn cvt_from(val: i16) -> i16 { val }
}
impl FromFmt<i16> for i32 {
- fn cvt_from(val: i16) -> i32 { i32::from(val).wrapping_mul(0x10001) }
+ fn cvt_from(val: i16) -> i32 { (i32::from(val) & 0xFFFF) | (i32::from(val) << 16) }
}
impl FromFmt<i16> for f32 {
fn cvt_from(val: i16) -> f32 { f32::from(val) / 32768.0 }
fn cvt_from(val: f32) -> u8 { ((val * 128.0) + 128.0).min(255.0).max(0.0) as u8 }
}
impl FromFmt<f32> for i16 {
- fn cvt_from(val: f32) -> i16 { (val * 32768.0).min(16383.0).max(-16384.0) as i16 }
+ fn cvt_from(val: f32) -> i16 { (val * 32768.0).min(32767.0).max(-32768.0) as i16 }
}
impl FromFmt<f32> for i32 {
fn cvt_from(val: f32) -> i32 { (val * 31.0f32.exp2()) as i32 }
}
}
+struct S8SampleReader<'a> {
+ data: &'a [u8],
+ stride: usize,
+}
+
+impl<'a> SampleReader for S8SampleReader<'a> {
+ fn get_samples_i32(&self, pos: usize, dst: &mut Vec<i32>) {
+ let mut off = pos;
+ for el in dst.iter_mut() {
+ *el = (self.data[off] ^ 0x80).cvt_into();
+ off += self.stride;
+ }
+ }
+ fn get_samples_f32(&self, pos: usize, dst: &mut Vec<f32>) {
+ let mut off = pos;
+ for el in dst.iter_mut() {
+ *el = (self.data[off] ^ 0x80).cvt_into();
+ off += self.stride;
+ }
+ }
+}
+
struct PackedSampleReader<'a> {
data: &'a [u8],
fmt: NASoniton,
let src = &self.data[offset..];
*el = if !self.fmt.float {
match (self.bpp, self.fmt.be) {
- (1, _) => src[0].cvt_into(),
+ (1, _) => if !self.fmt.signed { src[0].cvt_into() } else { (src[0] ^ 0x80).cvt_into() },
(2, true) => (read_u16be(src).unwrap() as i16).cvt_into(),
(2, false) => (read_u16le(src).unwrap() as i16).cvt_into(),
(3, true) => ((read_u24be(src).unwrap() << 8) as i32).cvt_into(),
match (self.bpp, self.fmt.be) {
(1, _) => {
dst[0] = u8::cvt_from(*el);
+ if self.fmt.signed {
+ dst[0] ^= 0x80;
+ }
},
(2, true) => write_u16be(dst, i16::cvt_from(*el) as u16).unwrap(),
(2, false) => write_u16le(dst, i16::cvt_from(*el) as u16).unwrap(),
NABufferType::AudioU8(ref ab) => {
let stride = ab.get_stride();
let data = ab.get_data();
- Box::new(GenericSampleReader { data, stride })
+ if !src_fmt.signed {
+ Box::new(GenericSampleReader { data, stride })
+ } else {
+ Box::new(S8SampleReader { data, stride })
+ }
},
NABufferType::AudioI16(ref ab) => {
let data = ab.get_data();