X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-game%2Fsrc%2Fcodecs%2Fvmd.rs;h=a70ef6044e2518a3e47af225e3ae8b05ec556502;hb=3c38de0f394218a267cf15edda331dc4f2ed61bb;hp=c6d98aa2d52dcfc1b26967883372e971426f8005;hpb=9895bd7b1732a96f0b3f61bf7c95ba342bd08b1e;p=nihav.git diff --git a/nihav-game/src/codecs/vmd.rs b/nihav-game/src/codecs/vmd.rs index c6d98aa..a70ef60 100644 --- a/nihav-game/src/codecs/vmd.rs +++ b/nihav-game/src/codecs/vmd.rs @@ -330,7 +330,7 @@ impl VMDAudioDecoder { } let mut ch = 0; let flip_ch = if channels == 2 { 1 } else { 0 }; - for _ in 1..self.blk_align { + for _ in channels..self.blk_align*channels { let b = br.read_byte()? as usize; if (b & 0x80) != 0 { pred[ch] -= SOL_AUD_STEPS16[b & 0x7F] as i32; @@ -358,12 +358,13 @@ impl NADecoder for VMDAudioDecoder { fmt = SND_U8_FORMAT; self.is16bit = false; self.blk_size = ainfo.get_block_len(); + self.blk_align = ainfo.get_block_len() / (ainfo.get_channels() as usize); } else { fmt = SND_S16P_FORMAT; self.is16bit = true; self.blk_size = (ainfo.get_block_len() + 1) * (ainfo.get_channels() as usize); + self.blk_align = ainfo.get_block_len(); }; - self.blk_align = ainfo.get_block_len() / (ainfo.get_channels() as usize); self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), ainfo.get_channels(), fmt, ainfo.get_block_len()); self.chmap = NAChannelMap::from_str(if ainfo.get_channels() == 1 { "C" } else { "L,R" }).unwrap(); Ok(()) @@ -410,12 +411,21 @@ impl NADecoder for VMDAudioDecoder { for i in 0..self.blk_align * channels { dst[doff + i] = 0; } - } else { - for i in 0..self.blk_align * channels { + } 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 = br.read_byte()?; + if val < 128 { + dst[doff + i] = 127 - val; + } else { + dst[doff + i] = val; + } + } } - doff += self.blk_align; + doff += self.blk_align * channels; mask >>= 1; } } @@ -448,8 +458,8 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); game_register_all_codecs(&mut dec_reg); -// let file = "assets/1491.VMD"; - let file = "assets/128.vmd"; +// let file = "assets/Game/1491.VMD"; + let file = "assets/Game/128.vmd"; test_file_decoding("vmd", file, Some(10), true, false, None/*Some("vmd")*/, &dmx_reg, &dec_reg); } #[test] @@ -459,8 +469,10 @@ mod test { let mut dec_reg = RegisteredDecoders::new(); game_register_all_codecs(&mut dec_reg); -// let file = "assets/1491.VMD"; - let file = "assets/128.vmd"; +// let file = "assets/Game/1491.VMD"; + let file = "assets/Game/128.vmd"; +// let file = "assets/Game/1000.VMD"; +// let file = "assets/Game/235.VMD"; test_decode_audio("vmd", file, None, "vmd", &dmx_reg, &dec_reg); } }