X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fsoundcvt%2Fmod.rs;h=891a58a3933442d6d91a2e91192e74181acf62d2;hb=952dad98a4a5ae723e3c2432b62567d88b4c3c0d;hp=154b59f22ee58e9e0130c50208dee93328c437d1;hpb=b3ed5db70cd1e2a03234866c5b1e37a71aaf4f14;p=nihav.git diff --git a/nihav-core/src/soundcvt/mod.rs b/nihav-core/src/soundcvt/mod.rs index 154b59f..891a58a 100644 --- a/nihav-core/src/soundcvt/mod.rs +++ b/nihav-core/src/soundcvt/mod.rs @@ -139,7 +139,16 @@ impl FromFmt for i16 { fn cvt_from(val: f32) -> i16 { (val * 32768.0).min(32767.0).max(-32768.0) as i16 } } impl FromFmt for i32 { - fn cvt_from(val: f32) -> i32 { (val * 31.0f32.exp2()) as i32 } + fn cvt_from(val: f32) -> i32 { + if val >= 1.0 { + std::i32::MAX + } else if val <= -1.0 { + std::i32::MIN + } else { + let scale = (1u32 << 31) as f32; + (val * scale) as i32 + } + } } impl FromFmt for f32 { fn cvt_from(val: f32) -> f32 { val } @@ -626,7 +635,7 @@ mod test { let l = data[off0]; let r = data[off1]; assert_eq!(l, 7445); - assert_eq!(r, -19943); + assert_eq!(r, -19505); } else { panic!("wrong buffer type"); }