- if self.is16bit {
- let mut adata = abuf.get_abuf_i16().unwrap();
- let off1 = adata.get_offset(1);
- let mut dst = adata.get_data_mut().unwrap();
- self.decode_16bit(&mut dst, off1, &mut br, nblocks, mask)?;
- } else {
- let mut adata = abuf.get_abuf_u8().unwrap();
- let dst = adata.get_data_mut().unwrap();
- let mut doff = 0;
- let mut mask = mask;
- let channels = self.chmap.num_channels();
- for _ in 0..nblocks {
- if (mask & 1) != 0 {
- for i in 0..self.blk_align * channels {
- dst[doff + i] = 128;
+ match self.mode {
+ VMDAudioMode::DPCM => {
+ let mut adata = abuf.get_abuf_i16().unwrap();
+ let off1 = adata.get_offset(1);
+ let mut dst = adata.get_data_mut().unwrap();
+ self.decode_16bit(&mut dst, off1, &mut br, nblocks, mask)?;
+ },
+ VMDAudioMode::U8 => {
+ let mut adata = abuf.get_abuf_u8().unwrap();
+ let dst = adata.get_data_mut().unwrap();
+ let mut doff = 0;
+ let mut mask = mask;
+ let channels = self.chmap.num_channels();
+ for _ in 0..nblocks {
+ if (mask & 1) != 0 {
+ for i in 0..self.blk_align * channels {
+ dst[doff + i] = 128;
+ }
+ } else if channels == 1 {
+ for i in 0..self.blk_size {
+ dst[doff + i] = br.read_byte()?;
+ }
+ } else {
+ for i in 0..self.blk_size {
+ let val = Self::cvt_u8(br.read_byte()?);
+ dst[doff + i] = val;
+ }