// Convert an XMSample to OpenMPT's internal sample representation. void XMSample::ConvertToMPT(ModSample &mptSmp) const //-------------------------------------------------- { mptSmp.Initialize(MOD_TYPE_XM); // Volume mptSmp.nVolume = vol * 4; LimitMax(mptSmp.nVolume, uint16(256)); // Panning mptSmp.nPan = pan; mptSmp.uFlags = CHN_PANNING; // Sample Frequency mptSmp.nFineTune = finetune; mptSmp.RelativeTone = relnote; // Sample Length and Loops mptSmp.nLength = length; mptSmp.nLoopStart = loopStart; mptSmp.nLoopEnd = mptSmp.nLoopStart + loopLength; if((flags & XMSample::sample16Bit)) { mptSmp.nLength /= 2; mptSmp.nLoopStart /= 2; mptSmp.nLoopEnd /= 2; } if((flags & XMSample::sampleStereo)) { mptSmp.nLength /= 2; mptSmp.nLoopStart /= 2; mptSmp.nLoopEnd /= 2; } if((flags & (XMSample::sampleLoop | XMSample::sampleBidiLoop)) && mptSmp.nLoopStart < mptSmp.nLength && mptSmp.nLoopEnd > mptSmp.nLoopStart) { mptSmp.uFlags.set(CHN_LOOP); if((flags & XMSample::sampleBidiLoop)) { mptSmp.uFlags.set(CHN_PINGPONGLOOP); } } mptSmp.SanitizeLoops(); strcpy(mptSmp.filename, ""); }
bool PrecomputeLoops(ModSample &smp, CSoundFile &sndFile, bool updateChannels) //---------------------------------------------------------------------------- { if(smp.nLength == 0 || smp.pSample == nullptr) return false; smp.SanitizeLoops(); // Update channels with possibly changed loop values if(updateChannels) { UpdateLoopPoints(smp, sndFile); } if(smp.GetElementarySampleSize() == 2) PrecomputeLoopsImpl<int16>(smp, sndFile); else if(smp.GetElementarySampleSize() == 1) PrecomputeLoopsImpl<int8>(smp, sndFile); return true; }