From: <sv...@op...> - 2024-11-08 22:20:27
|
Author: sagamusix Date: Fri Nov 8 23:20:11 2024 New Revision: 22117 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22117 Log: [Ref] FC: Simplify wavetable reading code. Modified: trunk/OpenMPT/soundlib/Load_fc.cpp Modified: trunk/OpenMPT/soundlib/Load_fc.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_fc.cpp Fri Nov 8 22:53:21 2024 (r22116) +++ trunk/OpenMPT/soundlib/Load_fc.cpp Fri Nov 8 23:20:11 2024 (r22117) @@ -472,9 +472,9 @@ static constexpr uint8 SampleLengths[] = { - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 16, 16, 16, 16, 16, 16, 16, 16, 32, 16, 32, 32, 16, 16, 48, // Future Composer 1.4 imports the last sample with a length of 32 instead, causing some older FC files to be detuned. + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 8, 8, 8, 8, 8, 8, 8, 8, 16, 8, 16, 16, 8, 8, 24, // Future Composer 1.4 imports the last sample with a length of 32 instead of 48, causing some older FC files to be detuned. }; static constexpr uint8 SampleData[] = @@ -527,35 +527,22 @@ 0x00, 0x00, 0x40, 0x60, 0x7F, 0x60, 0x40, 0x20, 0x00, 0xE0, 0xC0, 0xA0, 0x80, 0xA0, 0xC0, 0xE0, 0x80, 0x80, 0x90, 0x98, 0xA0, 0xA8, 0xB0, 0xB8, 0xC0, 0xC8, 0xD0, 0xD8, 0xE0, 0xE8, 0xF0, 0xF8, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38, 0x40, 0x48, 0x50, 0x58, 0x60, 0x68, 0x70, 0x7F, 0x80, 0x80, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, }; - + + if(isFC14 && !file.Seek(fileHeader.waveTableOffset)) + return false; + + FileReader smpFile{mpt::as_span(SampleData)}; + const mpt::span<const uint8> sampleLengths = isFC14 ? mpt::as_span(waveTableLengths) : mpt::as_span(SampleLengths); SampleIO sampleIO{SampleIO::_8bit, SampleIO::mono, SampleIO::bigEndian, SampleIO::signedPCM}; - if(isFC14) - { - if(!file.Seek(fileHeader.waveTableOffset)) - return false; - for(SAMPLEINDEX smp = 0; smp < waveTableLengths.size(); smp++) - { - ModSample &mptSmp = Samples[smp + 11]; - mptSmp.Initialize(MOD_TYPE_MOD); - mptSmp.nLength = waveTableLengths[smp] * 2u; - mptSmp.nLoopStart = 0; - mptSmp.nLoopEnd = mptSmp.nLength; - mptSmp.uFlags.set(CHN_LOOP); - sampleIO.ReadSample(mptSmp, file); - } - } else + for(SAMPLEINDEX smp = 0; smp < sampleLengths.size(); smp++) { - FileReader smpFile{mpt::as_span(SampleData)}; - for(SAMPLEINDEX smp = 0; smp < std::size(SampleLengths); smp++) - { - ModSample &mptSmp = Samples[smp + 11]; - mptSmp.Initialize(MOD_TYPE_MOD); - mptSmp.nLength = SampleLengths[smp]; - mptSmp.nLoopStart = 0; - mptSmp.nLoopEnd = mptSmp.nLength; - mptSmp.uFlags.set(CHN_LOOP); - sampleIO.ReadSample(mptSmp, smpFile); - } + ModSample &mptSmp = Samples[smp + 11]; + mptSmp.Initialize(MOD_TYPE_MOD); + mptSmp.nLength = sampleLengths[smp] * 2u; + mptSmp.nLoopStart = 0; + mptSmp.nLoopEnd = mptSmp.nLength; + mptSmp.uFlags.set(CHN_LOOP); + sampleIO.ReadSample(mptSmp, isFC14 ? file : smpFile); } return true; |