From: <sv...@op...> - 2024-04-27 22:15:37
|
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++; |