From fc1d6ba3a036b01fe7b66bbd681a6260a243ca34 Mon Sep 17 00:00:00 2001 From: philmoz Date: Sun, 19 Mar 2023 17:01:27 +1100 Subject: [PATCH] fix: Change mixer output value calculation to 'round away from 0' instead 'floor' (#3292) --- radio/src/mixer.cpp | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 6c4e314f9..fb7b4046a 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -273,16 +273,8 @@ int16_t applyLimits(uint8_t channel, int32_t value) value = (int32_t) value * tmp; // div by 1024*256 -> output = -1024..1024 #endif -#ifdef CORRECT_NEGATIVE_SHIFTS - int8_t sign = (value<0?1:0); - value -= sign; - tmp = value>>16; // that's quite tricky: the shiftright 16 operation is assmbled just with addressmove; just forget the two least significant bytes; - tmp >>= 2; // now one simple shift right for two bytes does the rest - tmp += sign; -#else - tmp = value>>16; // that's quite tricky: the shiftright 16 operation is assmbled just with addressmove; just forget the two least significant bytes; - tmp >>= 2; // now one simple shift right for two bytes does the rest -#endif + // Round away from 0 + tmp = (value + (value < 0 ? (1<<17)-1 : (1<<17))) >> 18; ofs += tmp; // ofs can to added directly because already recalculated, }