From: <sv...@op...> - 2024-04-27 22:13:53
|
Author: sagamusix Date: Sun Apr 28 00:13:39 2024 New Revision: 20662 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20662 Log: [Fix] Opal: With mix rates exceeding 131kHz, it was possible that the interpolated output overflowed. The new linear interpolation is based on OpenMPT's own mixer code, and may also be slightly faster because it divides by SampleRate only once (https://bugs.openmpt.org/view.php?id=1775). Modified: trunk/OpenMPT/soundlib/opal.h Modified: trunk/OpenMPT/soundlib/opal.h ============================================================================== --- trunk/OpenMPT/soundlib/opal.h Fri Apr 26 22:06:39 2024 (r20661) +++ trunk/OpenMPT/soundlib/opal.h Sun Apr 28 00:13:39 2024 (r20662) @@ -22,6 +22,7 @@ #include <cstdint> +#include "../common/mptBaseUtils.h" @@ -574,9 +575,9 @@ } // Mix with the partial accumulation - int32_t omblend = SampleRate - SampleAccum; - *left = static_cast<uint16_t>((LastOutput[0] * omblend + CurrOutput[0] * SampleAccum) / SampleRate); - *right = static_cast<uint16_t>((LastOutput[1] * omblend + CurrOutput[1] * SampleAccum) / SampleRate); + const int32_t fract = Util::muldivr(SampleAccum, 65536, SampleRate); + *left = static_cast<int16_t>(LastOutput[0] + ((fract * (CurrOutput[0] - LastOutput[0])) / 65536)); + *right = static_cast<int16_t>(LastOutput[1] + ((fract * (CurrOutput[1] - LastOutput[1])) / 65536)); SampleAccum += OPL3SampleRate; } @@ -606,14 +607,14 @@ else if (leftmix > 0x7FFF) left = 0x7FFF; else - left = static_cast<uint16_t>(leftmix); + left = static_cast<int16_t>(leftmix); if (rightmix < -0x8000) right = -0x8000; else if (rightmix > 0x7FFF) right = 0x7FFF; else - right = static_cast<uint16_t>(rightmix); + right = static_cast<int16_t>(rightmix); Clock++; |