Skip to content

Commit

Permalink
Merged revision(s) 20662 from trunk/OpenMPT:
Browse files Browse the repository at this point in the history
[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).
........


git-svn-id: https://source.openmpt.org/svn/openmpt/branches/OpenMPT-1.31@20663 56274372-70c3-4bfc-bfc3-4c3a0b034d27
  • Loading branch information
sagamusix committed Apr 27, 2024
1 parent 11772ba commit 6ca7a76
Showing 1 changed file with 6 additions and 5 deletions.
11 changes: 6 additions & 5 deletions soundlib/opal.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@


#include <cstdint>
#include "../common/mptBaseUtils.h"



Expand Down Expand Up @@ -574,9 +575,9 @@ void Opal::Sample(int16_t *left, int16_t *right) {
}

// 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;
}
Expand Down Expand Up @@ -606,14 +607,14 @@ void Opal::Output(int16_t &left, int16_t &right) {
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++;

Expand Down

0 comments on commit 6ca7a76

Please sign in to comment.