+ VMDAudioMode::ADPCM => {
+ let mut adata = abuf.get_abuf_i16().unwrap();
+ let dst = adata.get_data_mut().unwrap();
+ let mut doff = 0;
+ if self.chmap.num_channels() == 1 {
+ let mut mask = mask;
+ let mut ima = IMAState::new();
+ for _ in 0..nblocks {
+ if (mask & 1) != 0 {
+ doff += (self.blk_size - 3) * 2;
+ mask >>= 1;
+ continue;
+ }
+ let pred = br.read_u16le()? as i16;
+ let step = br.read_byte()?;
+ validate!((step as usize) < IMA_STEP_TABLE.len());
+ ima.reset(pred, step);
+ for _ in 3..self.blk_size {
+ let b = br.read_byte()?;
+ dst[doff] = ima.expand_sample(b >> 4);
+ doff += 1;
+ dst[doff] = ima.expand_sample(b & 0xF);
+ doff += 1;
+ }
+ mask >>= 1;
+ }
+ } else {
+ return Err(DecoderError::InvalidData);
+ }
+ },