///! Maximum step value for IMA ADPCM.
pub const IMA_MAX_STEP: u8 = 88;
+#[derive(Clone,Copy,Debug)]
///! Decoder for IMA ADPCM.
pub struct IMAState {
///! Current sample value.
let sign = (nibble & 8) != 0;
let diff = (i32::from(2 * (nibble & 7) + 1) * IMA_STEP_TABLE[self.step]) >> 3;
let sample = if !sign { self.predictor + diff } else { self.predictor - diff };
- self.predictor = sample.max(i32::from(std::i16::MIN)).min(i32::from(std::i16::MAX));
+ self.predictor = sample.max(i32::from(i16::MIN)).min(i32::from(i16::MAX));
self.step = istep.max(0).min(IMA_MAX_STEP as isize) as usize;
self.predictor as i16
}
+ ///! Computes an encoded nibble from an input sample.
+ pub fn compress_sample(&self, sample: i16) -> u8 {
+ let diff = i32::from(sample) - self.predictor;
+ let sign = if diff >= 0 { 0 } else { 8 };
+ let nib = (diff.abs() * 4 / IMA_STEP_TABLE[self.step]).min(7) as u8;
+ nib | sign
+ }
}
impl Default for IMAState {