From: <sag...@us...> - 2012-06-17 15:31:56
|
Revision: 1302 http://modplug.svn.sourceforge.net/modplug/?rev=1302&view=rev Author: saga-games Date: 2012-06-17 15:31:45 +0000 (Sun, 17 Jun 2012) Log Message: ----------- [Ref] Moved frequency / transpose conversion functions from CSoundFile to ModSample. [Ref] Added CSoundFile::AllocateInstrument which takes care of instrument initialisation and deleting old instrument. Modified Paths: -------------- trunk/OpenMPT/mptrack/Autotune.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/soundlib/Dlsbank.cpp trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_mid.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_mtm.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/ModSample.cpp trunk/OpenMPT/soundlib/ModSample.h trunk/OpenMPT/soundlib/SampleFormats.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/XMTools.cpp trunk/OpenMPT/soundlib/load_j2b.cpp trunk/OpenMPT/soundlib/pattern.h Modified: trunk/OpenMPT/mptrack/Autotune.cpp =================================================================== --- trunk/OpenMPT/mptrack/Autotune.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/mptrack/Autotune.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -193,6 +193,7 @@ vector<uint64> interpolatedHistogram(historyBins, 0); for(int i = 0; i < historyBins; i++) { + interpolatedHistogram[i] = autocorrHistogram[i]; const int kernelWidth = 4; for(int ki = kernelWidth; ki >= 0; ki--) { @@ -238,7 +239,7 @@ if((modType & (MOD_TYPE_XM | MOD_TYPE_MOD)) != 0) { - CSoundFile::FrequencyToTranspose(&sample); + sample.FrequencyToTranspose(); if((modType & MOD_TYPE_MOD) != 0) { sample.RelativeTone = 0; Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -122,14 +122,12 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); if(m_nInstrument > 0 && pSndFile && m_nInstrument <= pSndFile->GetNumInstruments() && pSndFile->Instruments[m_nInstrument] == nullptr) { - try + ModInstrument *instrument = pSndFile->AllocateInstrument(m_nInstrument); + if(instrument == nullptr) { - pSndFile->Instruments[m_nInstrument] = new ModInstrument(); - } catch(MPTMemoryException) - { return FALSE; } - m_pModDoc->InitializeInstrument(pSndFile->Instruments[m_nInstrument]); + m_pModDoc->InitializeInstrument(instrument); } InvalidateRect(NULL, FALSE); Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -530,7 +530,7 @@ if ((m_pSndFile) && (m_pSndFile->GetType() & (MOD_TYPE_XM | MOD_TYPE_MOD)) && (m_nSample)) { const ModSample &sample = m_pSndFile->GetSample(m_nSample); - UINT nFreqHz = CSoundFile::TransposeToFrequency(sample.RelativeTone, sample.nFineTune); + UINT nFreqHz = ModSample::TransposeToFrequency(sample.RelativeTone, sample.nFineTune); wsprintf(pszText, "%ldHz", nFreqHz); return TRUE; } @@ -690,12 +690,12 @@ } //end rewbs.fix36944 // FineTune / C-4 Speed / BaseNote - int transp = 0; + int transp = 0; if (m_pSndFile->GetType() & (MOD_TYPE_S3M | MOD_TYPE_IT | MOD_TYPE_MPT)) { wsprintf(s, "%lu", sample.nC5Speed); m_EditFineTune.SetWindowText(s); - transp = CSoundFile::FrequencyToTranspose(sample.nC5Speed) >> 7; + transp = ModSample::FrequencyToTranspose(sample.nC5Speed) >> 7; } else { int ftune = ((int)sample.nFineTune); @@ -1047,7 +1047,7 @@ else { // save all samples - CString sPath = m_pSndFile->m_pModDoc->GetPathName(); + CString sPath = m_pSndFile->GetpModDoc()->GetPathName(); if(sPath.IsEmpty()) sPath = "untitled"; sPath += " - %sample_number% - "; @@ -2476,7 +2476,7 @@ if ((n > 0) && (n <= (m_pSndFile->GetType() == MOD_TYPE_S3M ? 65535 : 9999999)) && (n != (int)m_pSndFile->GetSample(m_nSample).nC5Speed)) { m_pSndFile->GetSample(m_nSample).nC5Speed = n; - int transp = CSoundFile::FrequencyToTranspose(n) >> 7; + int transp = ModSample::FrequencyToTranspose(n) >> 7; int basenote = 60 - transp; if (basenote < BASENOTE_MIN) basenote = BASENOTE_MIN; if (basenote >= BASENOTE_MAX) basenote = BASENOTE_MAX-1; @@ -2513,8 +2513,8 @@ if (m_pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_S3M|MOD_TYPE_MPT)) { - LONG ft = CSoundFile::FrequencyToTranspose(sample.nC5Speed) & 0x7F; - n = CSoundFile::TransposeToFrequency(n, ft); + LONG ft = ModSample::FrequencyToTranspose(sample.nC5Speed) & 0x7F; + n = ModSample::TransposeToFrequency(n, ft); if ((n > 0) && (n <= (m_pSndFile->GetType() == MOD_TYPE_S3M ? 65535 : 9999999)) && (n != (int)sample.nC5Speed)) { CHAR s[32]; @@ -3006,7 +3006,7 @@ if(d < m_nFinetuneStep) d = m_nFinetuneStep; d += (pos * m_nFinetuneStep); sample.nC5Speed = Clamp(d, 1u, 9999999u); // 9999999 is max. in Impulse Tracker - int transp = CSoundFile::FrequencyToTranspose(sample.nC5Speed) >> 7; + int transp = ModSample::FrequencyToTranspose(sample.nC5Speed) >> 7; int basenote = 60 - transp; if (basenote < BASENOTE_MIN) basenote = BASENOTE_MIN; if (basenote >= BASENOTE_MAX) basenote = BASENOTE_MAX-1; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -737,13 +737,10 @@ if ((!m_SndFile.m_nInstruments) && (m_SndFile.GetType() & MOD_TYPE_XM)) { - try + if(m_SndFile.AllocateInstrument(1, 1)) { - m_SndFile.Instruments[1] = new ModInstrument(1); m_SndFile.m_nInstruments = 1; InitializeInstrument(m_SndFile.Instruments[1]); - } catch(MPTMemoryException) - { } } if (m_SndFile.GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_XM)) @@ -1273,8 +1270,7 @@ { m_bsMultiRecordMask.reset(channel); m_bsMultiSplitRecordMask.reset(channel); - } - else + } else { m_bsMultiRecordMask.flip(channel); m_bsMultiSplitRecordMask.reset(channel); @@ -1288,8 +1284,7 @@ { m_bsMultiRecordMask.reset(channel); m_bsMultiSplitRecordMask.reset(channel); - } - else + } else { m_bsMultiSplitRecordMask.flip(channel); m_bsMultiRecordMask.reset(channel); @@ -1303,8 +1298,7 @@ { m_bsMultiRecordMask.reset(); m_bsMultiSplitRecordMask.reset(); - } - else + } else { m_bsMultiRecordMask.set(); m_bsMultiSplitRecordMask.set(); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -320,17 +320,15 @@ const bool muted = IsSampleMuted(smp); MuteSample(smp, false); - try + ModInstrument *instrument = m_SndFile.AllocateInstrument(smp, smp); + if(instrument == nullptr) { - m_SndFile.Instruments[smp] = new ModInstrument(smp); - } catch(MPTMemoryException) - { ErrorBox(IDS_ERR_OUTOFMEMORY, CMainFrame::GetMainFrame()); return false; } - InitializeInstrument(m_SndFile.Instruments[smp]); - lstrcpyn(m_SndFile.Instruments[smp]->name, m_SndFile.m_szNames[smp], MAX_INSTRUMENTNAME); + InitializeInstrument(instrument); + lstrcpyn(instrument->name, m_SndFile.m_szNames[smp], MAX_INSTRUMENTNAME); MuteInstrument(smp, muted); } @@ -523,19 +521,17 @@ } } - ModInstrument *pIns; - try + CriticalSection cs; + + ModInstrument *pIns = m_SndFile.AllocateInstrument(newsmp); + if(pIns == nullptr) { - pIns = new ModInstrument(newsmp); - } catch(MPTMemoryException) - { + cs.Leave(); ErrorBox(IDS_ERR_OUTOFMEMORY, CMainFrame::GetMainFrame()); return INSTRUMENTINDEX_INVALID; } InitializeInstrument(pIns); - CriticalSection cs; - if (pDup) { *pIns = *pDup; Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -319,7 +319,7 @@ LONG lSampleRate = pSndFile->GetSample(m_nSample).nC5Speed; if (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) { - lSampleRate = CSoundFile::TransposeToFrequency(pSndFile->GetSample(m_nSample).RelativeTone, pSndFile->GetSample(m_nSample).nFineTune); + lSampleRate = ModSample::TransposeToFrequency(pSndFile->GetSample(m_nSample).RelativeTone, pSndFile->GetSample(m_nSample).nFineTune); } if (!lSampleRate) lSampleRate = 8363; ULONG msec = ((ULONG)selLength * 1000) / lSampleRate; @@ -1308,7 +1308,7 @@ const char cOffsetChar = pSndFile->GetModSpecifications().GetEffectLetter(CMD_OFFSET); const bool bHasHighOffset = (pSndFile->TypeIsS3M_IT_MPT() || (pSndFile->GetType() == MOD_TYPE_XM)); - const char cHighOffsetChar = pSndFile->GetModSpecifications().GetEffectLetter((pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_XFINEPORTAUPDOWN); + const char cHighOffsetChar = pSndFile->GetModSpecifications().GetEffectLetter(static_cast<ModCommand::COMMAND>(pSndFile->TypeIsS3M_IT_MPT() ? CMD_S3MCMDEX : CMD_XFINEPORTAUPDOWN)); if(xHigh == 0) wsprintf(s, "Offset: %c%02X", cOffsetChar, xLow); @@ -1884,7 +1884,7 @@ pfmt->freqHz = sample.nC5Speed; if (pSndFile->m_nType & (MOD_TYPE_MOD|MOD_TYPE_XM)) { - pfmt->freqHz = CSoundFile::TransposeToFrequency(sample.RelativeTone, sample.nFineTune); + pfmt->freqHz = ModSample::TransposeToFrequency(sample.RelativeTone, sample.nFineTune); } pfmt->channels = (sample.uFlags & CHN_STEREO) ? (WORD)2 : (WORD)1; pfmt->bitspersample = (sample.uFlags & CHN_16BIT) ? (WORD)16 : (WORD)8; Modified: trunk/OpenMPT/soundlib/Dlsbank.cpp =================================================================== --- trunk/OpenMPT/soundlib/Dlsbank.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Dlsbank.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -1583,7 +1583,7 @@ sFineTune+(60 + transpose - usUnityNote)*100); sample.nFineTune = (CHAR)(nBaseTune & 0x7F); sample.RelativeTone = (CHAR)(nBaseTune >> 7); - sample.nC5Speed = CSoundFile::TransposeToFrequency(sample.RelativeTone, sample.nFineTune); + sample.TransposeToFrequency(); if (lVolume > 256) lVolume = 256; if (lVolume < 16) lVolume = 16; sample.nGlobalVol = (BYTE)(lVolume / 4); // 0-64 Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2012-06-17 15:31:45 UTC (rev 1302) @@ -245,16 +245,12 @@ nsmp = BigEndianW(pih->sampleno); psmp = ((nsmp) && (nsmp < MAX_SAMPLES)) ? &Samples[nsmp] : nullptr; - try + pIns = AllocateInstrument(iIns + 1, nsmp); + if(pIns == nullptr) { - pIns = new ModInstrument(nsmp); - } catch(MPTMemoryException) - { break; } - Instruments[iIns + 1] = pIns; - StringFixer::ReadString<StringFixer::maybeNullTerminated>(pIns->name, pih->name); if (psmp) { Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -220,7 +220,7 @@ Samples[smp].nLoopStart = min(gdmSample.loopBegin, Samples[smp].nLength); // in samples Samples[smp].nLoopEnd = min(gdmSample.loopEnd - 1, Samples[smp].nLength); // dito - FrequencyToTranspose(&Samples[smp]); // set transpose + finetune for mod files + Samples[smp].FrequencyToTranspose(); // set transpose + finetune for mod files // Fix transpose + finetune for some rare cases where transpose is not C-5 (e.g. sample 4 in wander2.gdm) if(m_nType == MOD_TYPE_MOD) Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -492,16 +492,12 @@ //if(memcmp(imfins.ii10, "II10", 4) != 0) // return false; - try + pIns = AllocateInstrument(nIns + 1); + if(pIns == nullptr) { - pIns = new ModInstrument(); - } catch(MPTMemoryException) - { continue; } - Instruments[nIns + 1] = pIns; - StringFixer::ReadString<StringFixer::nullTerminated>(pIns->name, imfins.name); if(imfins.smpnum) Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -730,13 +730,10 @@ { if ((inspos[nins] > 0) && (inspos[nins] <= dwMemLength - (itHeader.cmwt < 0x200 ? sizeof(ITOldInstrument) : sizeof(ITInstrument)))) { - try + ModInstrument *instrument = AllocateInstrument(nins + 1); + if(instrument != nullptr) { - Instruments[nins + 1] = new ModInstrument(); - ITInstrToMPT(lpStream + inspos[nins], Instruments[nins + 1], itHeader.cmwt, dwMemLength - inspos[nins]); - } catch(MPTMemoryException) - { - continue; + ITInstrToMPT(lpStream + inspos[nins], instrument, itHeader.cmwt, dwMemLength - inspos[nins]); } } } Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -414,14 +414,11 @@ if (!Instruments[nins]) { UINT note = 12; - try + ModInstrument *pIns = AllocateInstrument(nins); + if(pIns == nullptr) { - Instruments[nins] = new ModInstrument(); - } catch(MPTMemoryException) - { break; } - ModInstrument *pIns = Instruments[nins]; // I give up. better rewrite this crap (or take SchismTracker's MDL loader). StringFixer::ReadString<StringFixer::maybeNullTerminated>(pIns->name, reinterpret_cast<const char *>(lpStream + dwPos + 2), 32); @@ -468,13 +465,7 @@ } for (j=1; j<=m_nInstruments; j++) if (!Instruments[j]) { - try - { - Instruments[j] = new ModInstrument(); - } catch(MPTMemoryException) - { - } - + AllocateInstrument(j); } break; // VE: Volume Envelope Modified: trunk/OpenMPT/soundlib/Load_mid.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mid.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_mid.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -394,17 +394,14 @@ } if ((m_nInstruments + 1 >= MAX_INSTRUMENTS) || (m_nSamples + 1 >= MAX_SAMPLES)) return 0; - try + pIns = AllocateInstrument(m_nInstruments + 1); + if(pIns == nullptr) { - pIns = new ModInstrument(); - } catch(MPTMemoryException) - { return 0; } m_nSamples++; m_nInstruments++; - Instruments[m_nInstruments] = pIns; pIns->wMidiBank = nBank; pIns->nMidiProgram = nProgram; pIns->nMidiChannel = nChannel; Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -412,13 +412,10 @@ ModInstrument *pIns = NULL; if (iIns <= m_nInstruments) { - try + pIns = AllocateInstrument(iIns); + if(pIns != nullptr) { - pIns = new ModInstrument(); - Instruments[iIns] = pIns; StringFixer::ReadString<StringFixer::maybeNullTerminated>(pIns->name, pmi->szName); - } catch(MPTMemoryException) - { } } #ifdef MT2DEBUG @@ -540,9 +537,9 @@ psmp->nC5Speed = pms->dwFrequency; psmp->nLoopStart = pms->dwLoopStart; psmp->nLoopEnd = pms->dwLoopEnd; - FrequencyToTranspose(psmp); + psmp->FrequencyToTranspose(); psmp->RelativeTone -= pms->nBaseNote - 49; - psmp->nC5Speed = TransposeToFrequency(psmp->RelativeTone, psmp->nFineTune); + psmp->TransposeToFrequency(); if (pms->nQuality == 2) { psmp->uFlags |= CHN_16BIT; psmp->nLength >>= 1; } if (pms->nChannels == 2) { psmp->nLength >>= 1; } if (pms->nLoop == 1) psmp->uFlags |= CHN_LOOP; Modified: trunk/OpenMPT/soundlib/Load_mtm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mtm.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_mtm.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -90,7 +90,7 @@ Samples[i].nLoopEnd >>= 1; } Samples[i].nPan = 128; - Samples[i].nC5Speed = TransposeToFrequency(0, Samples[i].nFineTune); + Samples[i].nC5Speed = ModSample::TransposeToFrequency(0, Samples[i].nFineTune); } dwMemPos += 37; } Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -1046,8 +1046,8 @@ // It seems like that finetune and transpose are added to the already given c2freq... That's a double WTF! // Why on earth would you want to use both systems at the same time? - CSoundFile::FrequencyToTranspose(&mptSmp); - mptSmp.nC5Speed = CSoundFile::TransposeToFrequency(mptSmp.RelativeTone + (finetune >> 4) - 7, MOD2XMFineTune(finetune & 0x0F)); + mptSmp.FrequencyToTranspose(); + mptSmp.nC5Speed = ModSample::TransposeToFrequency(mptSmp.RelativeTone + (finetune >> 4) - 7, MOD2XMFineTune(finetune & 0x0F)); mptSmp.nVolume = volume << 2; mptSmp.nGlobalVol = 256; Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -359,7 +359,7 @@ c5speed = mptSmp.nC5Speed; } else { - c5speed = CSoundFile::TransposeToFrequency(mptSmp.RelativeTone, mptSmp.nFineTune); + c5speed = ModSample::TransposeToFrequency(mptSmp.RelativeTone, mptSmp.nFineTune); } magic = idSCRS; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -362,11 +362,8 @@ memcpy(&insHeader, lpStream + dwMemPos, min(sizeof(XMInstrumentHeader), insHeaderSize)); dwMemPos += insHeaderSize; - try + if(AllocateInstrument(instr) == nullptr) { - Instruments[instr] = new ModInstrument(); - } catch(MPTMemoryException) - { continue; } Modified: trunk/OpenMPT/soundlib/ModSample.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModSample.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/ModSample.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -20,12 +20,12 @@ // Convert between frequency and transpose values if necessary. if ((!(toType & (MOD_TYPE_MOD | MOD_TYPE_XM))) && (fromType & (MOD_TYPE_MOD | MOD_TYPE_XM))) { - nC5Speed = CSoundFile::TransposeToFrequency(RelativeTone, nFineTune); + TransposeToFrequency(); RelativeTone = 0; nFineTune = 0; } else if((toType & (MOD_TYPE_MOD | MOD_TYPE_XM)) && (!(fromType & (MOD_TYPE_MOD | MOD_TYPE_XM)))) { - CSoundFile::FrequencyToTranspose(this); + FrequencyToTranspose(); if(toType & MOD_TYPE_MOD) { RelativeTone = 0; @@ -122,7 +122,7 @@ { uint32 rate; if(type & (MOD_TYPE_MOD | MOD_TYPE_XM)) - rate = CSoundFile::TransposeToFrequency(RelativeTone, nFineTune); + rate = TransposeToFrequency(RelativeTone, nFineTune); else rate = nC5Speed; return (rate > 0) ? rate : 8363; @@ -151,4 +151,96 @@ { CSoundFile::FreeSample(pSample); pSample = nullptr; +} + + +///////////////////////////////////////////////////////////// +// Transpose <-> Frequency conversions + +// returns 8363*2^((transp*128+ftune)/(12*128)) +uint32 ModSample::TransposeToFrequency(int transpose, int finetune) +//----------------------------------------------------------------- +{ + // return (unsigned int) (8363.0 * pow(2, (transp * 128.0 + ftune) / 1536.0)); + const float _fbase = 8363; + const float _factor = 1.0f / (12.0f * 128.0f); + int result; + uint32 freq; + + transpose = (transpose << 7) + finetune; + _asm + { + fild transpose + fld _factor + fmulp st(1), st(0) + fist result + fisub result + f2xm1 + fild result + fld _fbase + fscale + fstp st(1) + fmul st(1), st(0) + faddp st(1), st(0) + fistp freq + } + uint32 derr = freq % 11025; + if(derr <= 8) freq -= derr; + if(derr >= 11015) freq += 11025 - derr; + derr = freq % 1000; + if(derr <= 5) freq -= derr; + if(derr >= 995) freq += 1000 - derr; + return freq; +} + + +void ModSample::TransposeToFrequency() +//------------------------------------ +{ + nC5Speed = TransposeToFrequency(RelativeTone, nFineTune); +} + + +// returns 12*128*log2(freq/8363) +int ModSample::FrequencyToTranspose(uint32 freq) +//---------------------------------------------- +{ + // return (int) (1536.0 * (log(freq / 8363.0) / log(2))); + + const float _f1_8363 = 1.0f / 8363.0f; + const float _factor = 128 * 12; + int result; + + if(!freq) + { + return 0; + } + + _asm + { + fld _factor + fild freq + fld _f1_8363 + fmulp st(1), st(0) + fyl2x + fistp result + } + return result; +} + + +void ModSample::FrequencyToTranspose() +//------------------------------------ +{ + int f2t = FrequencyToTranspose(nC5Speed); + int transpose = f2t >> 7; + int finetune = f2t & 0x7F; //0x7F == 111 1111 + if(finetune > 80) // XXX Why is this 80? + { + transpose++; + finetune -= 128; + } + Limit(transpose, -127, 127); + RelativeTone = static_cast<int8>(transpose); + nFineTune = static_cast<int8>(finetune); } \ No newline at end of file Modified: trunk/OpenMPT/soundlib/ModSample.h =================================================================== --- trunk/OpenMPT/soundlib/ModSample.h 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/ModSample.h 2012-06-17 15:31:45 UTC (rev 1302) @@ -58,4 +58,10 @@ size_t AllocateSample(); void FreeSample(); + + // Transpose <-> Frequency conversions + static uint32 TransposeToFrequency(int transpose, int finetune = 0); + void TransposeToFrequency(); + static int FrequencyToTranspose(uint32 freq); + void FrequencyToTranspose(); }; Modified: trunk/OpenMPT/soundlib/SampleFormats.cpp =================================================================== --- trunk/OpenMPT/soundlib/SampleFormats.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/SampleFormats.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -401,7 +401,7 @@ if(!(GetType() & (MOD_TYPE_MOD | MOD_TYPE_XM))) format.freqHz = LittleEndian(sample.nC5Speed); else - format.freqHz = LittleEndian(TransposeToFrequency(sample.RelativeTone, sample.nFineTune)); + format.freqHz = LittleEndian(ModSample::TransposeToFrequency(sample.RelativeTone, sample.nFineTune)); format.channels = LittleEndianW(sample.GetNumChannels()); format.bitspersample = LittleEndianW(sample.GetElementarySampleSize() * 8); format.samplesize = LittleEndianW(sample.GetBytesPerSample()); @@ -672,13 +672,13 @@ sample.nVibSweep = psh->vibrato_sweep; sample.nVibDepth = psh->vibrato_depth; sample.nVibRate = psh->vibrato_rate/4; - CSoundFile::FrequencyToTranspose(&sample); + sample.FrequencyToTranspose(); sample.RelativeTone += static_cast<uint8>(84 - PatchFreqToNote(psh->root_freq)); if(psh->scale_factor) { sample.RelativeTone = static_cast<uint8>(sample.RelativeTone - psh->scale_frequency - 60); } - sample.nC5Speed = CSoundFile::TransposeToFrequency(sample.RelativeTone, sample.nFineTune); + sample.TransposeToFrequency(); SampleIO sampleIO( SampleIO::_8bit, @@ -1200,10 +1200,10 @@ return SwapBytesBE(l); } - ChunkIdentifiers GetID() const + id_type GetID() const { uint32 i = id; - return static_cast<ChunkIdentifiers>(SwapBytesBE(i)); + return static_cast<id_type>(SwapBytesBE(i)); } }; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -1373,85 +1373,6 @@ } -///////////////////////////////////////////////////////////// -// Transpose <-> Frequency conversions - -// returns 8363*2^((transp*128+ftune)/(12*128)) -DWORD CSoundFile::TransposeToFrequency(int transp, int ftune) -//----------------------------------------------------------- -{ - // return (unsigned int) (8363.0 * pow(2, (transp * 128.0 + ftune) / 1536.0)); - const float _fbase = 8363; - const float _factor = 1.0f/(12.0f*128.0f); - int result; - DWORD freq; - - transp = (transp << 7) + ftune; - _asm { - fild transp - fld _factor - fmulp st(1), st(0) - fist result - fisub result - f2xm1 - fild result - fld _fbase - fscale - fstp st(1) - fmul st(1), st(0) - faddp st(1), st(0) - fistp freq - } - UINT derr = freq % 11025; - if (derr <= 8) freq -= derr; - if (derr >= 11015) freq += 11025-derr; - derr = freq % 1000; - if (derr <= 5) freq -= derr; - if (derr >= 995) freq += 1000-derr; - return freq; -} - - -// returns 12*128*log2(freq/8363) -int CSoundFile::FrequencyToTranspose(DWORD freq) -//---------------------------------------------- -{ - // return (int) (1536.0 * (log(freq / 8363.0) / log(2))); - - const float _f1_8363 = 1.0f / 8363.0f; - const float _factor = 128 * 12; - LONG result; - - if (!freq) return 0; - _asm { - fld _factor - fild freq - fld _f1_8363 - fmulp st(1), st(0) - fyl2x - fistp result - } - return result; -} - - -void CSoundFile::FrequencyToTranspose(ModSample *psmp) -//---------------------------------------------------- -{ - int f2t = FrequencyToTranspose(psmp->nC5Speed); - int transp = f2t >> 7; - int ftune = f2t & 0x7F; //0x7F == 111 1111 - if (ftune > 80) // XXX Why is this 80? - { - transp++; - ftune -= 128; - } - Limit(transp, -127, 127); - psmp->RelativeTone = static_cast<int8>(transp); - psmp->nFineTune = static_cast<int8>(ftune); -} - - void CSoundFile::CheckCPUUsage(UINT nCPU) //--------------------------------------- { @@ -2022,6 +1943,26 @@ } +ModInstrument *CSoundFile::AllocateInstrument(INSTRUMENTINDEX instr, SAMPLEINDEX assignedSample) +//---------------------------------------------------------------------------------------------- +{ + if(instr == 0 || instr >= MAX_INSTRUMENTS) + { + return nullptr; + } + + delete Instruments[instr]; + + try + { + return (Instruments[instr] = new ModInstrument(assignedSample)); + } catch(MPTMemoryException) + { + return (Instruments[instr] = nullptr); + } +} + + // Set up channel panning and volume suitable for MOD + similar files. If the current mod type is not MOD, bForceSetup has to be set to true. void CSoundFile::SetupMODPanning(bool bForceSetup) //------------------------------------------------ Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/Sndfile.h 2012-06-17 15:31:45 UTC (rev 1302) @@ -649,20 +649,16 @@ DWORD CutOffToFrequency(UINT nCutOff, int flt_modifier=256) const; // [0-127] => [1-10KHz] #ifdef MODPLUG_TRACKER void ProcessMidiOut(CHANNELINDEX nChn); -#endif +#endif // MODPLUG_TRACKER void ApplyGlobalVolume(int SoundBuffer[], int RearBuffer[], long lTotalSampleCount); - // Static helper functions -public: - static DWORD TransposeToFrequency(int transp, int ftune=0); - static int FrequencyToTranspose(DWORD freq); - static void FrequencyToTranspose(ModSample *psmp); - // System-Dependant functions public: static LPSTR AllocateSample(UINT nbytes); static void FreeSample(void *p); + ModInstrument *AllocateInstrument(INSTRUMENTINDEX instr, SAMPLEINDEX assignedSample = 0); + // WAV export static UINT Normalize24BitBuffer(LPBYTE pbuffer, UINT cbsizebytes, DWORD lmax24, DWORD dwByteInc); Modified: trunk/OpenMPT/soundlib/XMTools.cpp =================================================================== --- trunk/OpenMPT/soundlib/XMTools.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/XMTools.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -345,7 +345,7 @@ relnote = mptSmp.RelativeTone; } else { - int f2t = CSoundFile::FrequencyToTranspose(mptSmp.nC5Speed); + int f2t = ModSample::FrequencyToTranspose(mptSmp.nC5Speed); relnote = (int8)(f2t >> 7); finetune = (int8)(f2t & 0x7F); } Modified: trunk/OpenMPT/soundlib/load_j2b.cpp =================================================================== --- trunk/OpenMPT/soundlib/load_j2b.cpp 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/load_j2b.cpp 2012-06-17 15:31:45 UTC (rev 1302) @@ -824,23 +824,17 @@ continue; } - const INSTRUMENTINDEX nIns = instrHeader.index + 1; - if(nIns >= MAX_INSTRUMENTS) + const INSTRUMENTINDEX instr = instrHeader.index + 1; + if(instr >= MAX_INSTRUMENTS) continue; - if(Instruments[nIns] != nullptr) - delete Instruments[nIns]; - - try + ModInstrument *pIns = AllocateInstrument(instr); + if(pIns == nullptr) { - Instruments[nIns] = new ModInstrument(); - } catch(MPTMemoryException) - { continue; } - ModInstrument *pIns = Instruments[nIns]; - m_nInstruments = max(m_nInstruments, nIns); + m_nInstruments = max(m_nInstruments, instr); instrHeader.ConvertToMPT(*pIns, m_nSamples); @@ -895,17 +889,11 @@ if(instr >= MAX_INSTRUMENTS) continue; - if(Instruments[instr] != nullptr) - delete Instruments[instr]; - - try + ModInstrument *pIns = AllocateInstrument(instr); + if(pIns == nullptr) { - Instruments[instr] = new ModInstrument(); - } catch(MPTMemoryException) - { continue; } - ModInstrument *pIns = Instruments[instr]; m_nInstruments = max(m_nInstruments, instr); instrHeader.ConvertToMPT(*pIns, m_nSamples); Modified: trunk/OpenMPT/soundlib/pattern.h =================================================================== --- trunk/OpenMPT/soundlib/pattern.h 2012-06-15 22:01:22 UTC (rev 1301) +++ trunk/OpenMPT/soundlib/pattern.h 2012-06-17 15:31:45 UTC (rev 1302) @@ -92,12 +92,18 @@ // Patter name functions (for both CString and char[] arrays) - bool functions return true on success. bool SetName(const char *newName, size_t maxChars = MAX_PATTERNNAME); + template<size_t bufferSize> + bool SetName(const char (&buffer)[bufferSize]) + { + return SetName(buffer, bufferSize); + } bool SetName(const CString newName) { m_PatternName = newName; return true; }; + template<size_t bufferSize> bool GetName(char (&buffer)[bufferSize]) const { - return GetName(buffer, bufferSize); - } + return GetName(buffer, bufferSize); + } bool GetName(char *buffer, size_t maxChars) const; CString GetName() const { return m_PatternName; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |