Author: sagamusix
Date: Sun Apr 28 00:15:29 2024
New Revision: 20665
URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20665
Log:
Merged revision(s) 20660-20662 from trunk/OpenMPT:
[Fix] S3M: In mono mode, the ratio between sample and OPL volume was incorrect (https://bugs.openmpt.org/view.php?id=1774).
........
[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:
branches/OpenMPT-1.29/ (props changed)
branches/OpenMPT-1.29/soundlib/Load_s3m.cpp
branches/OpenMPT-1.29/soundlib/opal.h
Modified: branches/OpenMPT-1.29/soundlib/Load_s3m.cpp
==============================================================================
--- branches/OpenMPT-1.29/soundlib/Load_s3m.cpp Sun Apr 28 00:14:57 2024 (r20664)
+++ branches/OpenMPT-1.29/soundlib/Load_s3m.cpp Sun Apr 28 00:15:29 2024 (r20665)
@@ -425,15 +425,18 @@
else
m_nSamplePreAmp = std::max(fileHeader.masterVolume & 0x7F, 0x10); // Bit 7 = Stereo (we always use stereo)
- const bool isStereo = (fileHeader.masterVolume & 0x80) != 0 || m_dwLastSavedWithVersion;
- if(!isStereo)
- m_nSamplePreAmp = Util::muldivr_unsigned(m_nSamplePreAmp, 8, 11);
-
// Approximately as loud as in DOSBox and a real SoundBlaster 16
m_nVSTiVolume = 36;
if(isSchism && fileHeader.cwtv < SchismVersionFromDate<2018, 11, 12>::Version(S3MFileHeader::trkSchismTracker))
m_nVSTiVolume = 64;
+ const bool isStereo = (fileHeader.masterVolume & 0x80) != 0 || m_dwLastSavedWithVersion;
+ if(!isStereo)
+ {
+ m_nSamplePreAmp = Util::muldivr_unsigned(m_nSamplePreAmp, 8, 11);
+ m_nVSTiVolume = Util::muldivr_unsigned(m_nVSTiVolume, 8, 11);
+ }
+
// Channel setup
m_nChannels = 4;
std::bitset<32> isAdlibChannel;
@@ -477,8 +480,7 @@
// Read extended channel panning
if(fileHeader.usePanningTable == S3MFileHeader::idPanning)
{
- uint8 pan[32];
- file.ReadArray(pan);
+ const auto pan = file.ReadArray<uint8, 32>();
for(CHANNELINDEX i = 0; i < 32; i++)
{
if((pan[i] & 0x20) != 0 && (!isST3 || !isAdlibChannel[i]))
@@ -782,7 +784,8 @@
// Write patterns
enum class S3MChannelType : uint8 { kUnused = 0, kPCM = 1, kAdlib = 2 };
- FlagSet<S3MChannelType> channelType[32] = { S3MChannelType::kUnused };
+ std::array<FlagSet<S3MChannelType>, 32> channelType;
+ channelType.fill(S3MChannelType::kUnused);
bool globalCmdOnMutedChn = false;
for(PATTERNINDEX pat = 0; pat < writePatterns; pat++)
{
Modified: branches/OpenMPT-1.29/soundlib/opal.h
==============================================================================
--- branches/OpenMPT-1.29/soundlib/opal.h Sun Apr 28 00:14:57 2024 (r20664)
+++ branches/OpenMPT-1.29/soundlib/opal.h Sun Apr 28 00:15:29 2024 (r20665)
@@ -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++;
|