From: <sag...@us...> - 2010-03-26 23:11:27
|
Revision: 555 http://modplug.svn.sourceforge.net/modplug/?rev=555&view=rev Author: saga-games Date: 2010-03-26 23:11:20 +0000 (Fri, 26 Mar 2010) Log Message: ----------- [Fix] Mix Paste: When in MPT behaviour mode, empty FX commands were not overwritten properly when there previously was an effect in that field but only the effect number (and not the param value) was reset. [Fix] Added some nullptr checks for instruments here and there [Ref] Some more refactoring. Modified Paths: -------------- trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_ins.h trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/soundlib/Sampleio.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp =================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp 2010-03-26 23:11:20 UTC (rev 555) @@ -512,9 +512,10 @@ if(pSndFile == nullptr) return false; CHAR s[512]; - BOOL bIns[MAX_SAMPLES]; - UINT nExt = 0; - UINT nRemoved = 0; + vector<bool> bIns; + int nExt = 0; + int nRemoved = 0; + bIns.resize(pSndFile->GetNumSamples(), false); BeginWaitCursor(); for (SAMPLEINDEX nSmp = pSndFile->m_nSamples; nSmp >= 1; nSmp--) if (pSndFile->Samples[nSmp].pSample) @@ -530,7 +531,6 @@ } if (pSndFile->m_nInstruments) { - memset(bIns, 0, sizeof(bIns)); for (UINT ipat=0; ipat<pSndFile->Patterns.Size(); ipat++) { MODCOMMAND *p = pSndFile->Patterns[ipat]; @@ -547,7 +547,7 @@ if (pIns) { UINT n = pIns->Keyboard[p->note-1]; - if (n < MAX_SAMPLES) bIns[n] = TRUE; + if (n <= pSndFile->GetNumSamples()) bIns[n] = true; } } else { @@ -557,7 +557,7 @@ if (pIns) { UINT n = pIns->Keyboard[p->note-1]; - if (n < MAX_SAMPLES) bIns[n] = TRUE; + if (n <= pSndFile->GetNumSamples()) bIns[n] = true; } } } @@ -565,28 +565,29 @@ } } } - for (UINT ichk=1; ichk<MAX_SAMPLES; ichk++) + for (SAMPLEINDEX ichk = 1; ichk <= pSndFile->GetNumSamples(); ichk++) { if ((!bIns[ichk]) && (pSndFile->Samples[ichk].pSample)) nExt++; } } EndWaitCursor(); - if (nExt && !((pSndFile->m_nType & MOD_TYPE_IT) && (pSndFile->m_dwSongFlags&SONG_ITPROJECT))) + if (nExt && !((pSndFile->m_nType & MOD_TYPE_IT) && (pSndFile->m_dwSongFlags & SONG_ITPROJECT))) { //We don't remove an instrument's unused samples in an ITP. wsprintf(s, "OpenMPT detected %d sample%s referenced by an instrument,\n" - "but not used in the song. Do you want to remove them ?", nExt, (nExt == 1) ? "" : "s"); + "but not used in the song. Do you want to remove them?", nExt, (nExt == 1) ? "" : "s"); if (::MessageBox(NULL, s, "Sample Cleanup", MB_YESNO | MB_ICONQUESTION) == IDYES) { - for (SAMPLEINDEX j = 1; j < MAX_SAMPLES; j++) + for (SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->GetNumSamples(); nSmp++) { - if ((!bIns[j]) && (pSndFile->Samples[j].pSample)) + if ((!bIns[nSmp]) && (pSndFile->Samples[nSmp].pSample)) { BEGIN_CRITICAL(); - pSndFile->DestroySample(j); - if ((j == pSndFile->m_nSamples) && (j > 1)) pSndFile->m_nSamples--; + pSndFile->DestroySample(nSmp); + m_pModDoc->GetSampleUndo()->PrepareUndo(nSmp, sundo_delete); + if ((nSmp == pSndFile->m_nSamples) && (nSmp > 1)) pSndFile->m_nSamples--; END_CRITICAL(); nRemoved++; - m_pModDoc->GetSampleUndo()->ClearUndo(j); + m_pModDoc->GetSampleUndo()->ClearUndo(nSmp); } } wsprintf(s, "%d unused sample%s removed\n" ,nRemoved, (nRemoved == 1) ? "" : "s"); @@ -594,7 +595,7 @@ return true; } } - return false; + return (nRemoved > 0); } @@ -615,8 +616,8 @@ if (nLoopOpt == 0) return false; CHAR s[512]; - wsprintf(s, "OpenMPT detected %d sample%s with unused data after the loop end point,\n" - "Do you want to optimize it, and remove this unused data?", nLoopOpt, (nLoopOpt == 1) ? "" : "s"); + wsprintf(s, "%d sample%s unused data after the loop end point,\n" + "Do you want to optimize %s and remove this unused data?", nLoopOpt, (nLoopOpt == 1) ? " has" : "s have", (nLoopOpt == 1) ? "it" : "them"); if (::MessageBox(NULL, s, "Sample Optimization", MB_YESNO | MB_ICONQUESTION) == IDYES) { for (SAMPLEINDEX nSmp = 1; nSmp <= pSndFile->m_nSamples; nSmp++) @@ -684,11 +685,13 @@ memset(pSndFile->m_szNames[i], 0, sizeof(pSndFile->m_szNames[i])); // Also update instrument mapping (if module is in instrument mode) - for(INSTRUMENTINDEX iInstr = 1; iInstr <= pSndFile->m_nInstruments; iInstr++){ - if(pSndFile->Instruments[iInstr]){ - MODINSTRUMENT *p = pSndFile->Instruments[iInstr]; + for(INSTRUMENTINDEX nIns = 1; nIns <= pSndFile->m_nInstruments; nIns++) + { + MODINSTRUMENT *pIns = pSndFile->Instruments[nIns]; + if(pIns) + { for(WORD iNote = 0; iNote < 128; iNote++) - if(p->Keyboard[iNote] == i) p->Keyboard[iNote] = nSampleMap[i]; + if(pIns->Keyboard[iNote] == i) pIns->Keyboard[iNote] = nSampleMap[i]; } } } @@ -840,7 +843,8 @@ for (PLUGINDEX nPlug = 0; nPlug < MAX_MIXPLUGINS; nPlug++) { //Is the plugin assigned to a channel? - for (CHANNELINDEX nChn = 0; nChn < pSndFile->GetNumChannels(); nChn++) { + for (CHANNELINDEX nChn = 0; nChn < pSndFile->GetNumChannels(); nChn++) + { if (pSndFile->ChnSettings[nChn].nMixPlugin == nPlug + 1u) { usedmap[nPlug] = true; break; @@ -848,21 +852,24 @@ } //Is the plugin used by an instrument? - for (INSTRUMENTINDEX nIns=1; nIns<=pSndFile->GetNumInstruments(); nIns++) { - if (pSndFile->Instruments[nIns] && (pSndFile->Instruments[nIns]->nMixPlug == nPlug+1)) { + for (INSTRUMENTINDEX nIns=1; nIns<=pSndFile->GetNumInstruments(); nIns++) + { + if (pSndFile->Instruments[nIns] && (pSndFile->Instruments[nIns]->nMixPlug == nPlug+1)) + { usedmap[nPlug] = true; break; } } //Is the plugin assigned to master? - if (pSndFile->m_MixPlugins[nPlug].Info.dwInputRouting & MIXPLUG_INPUTF_MASTEREFFECT) { + if (pSndFile->m_MixPlugins[nPlug].Info.dwInputRouting & MIXPLUG_INPUTF_MASTEREFFECT) usedmap[nPlug] = true; - } //all outputs of used plugins count as used - if (usedmap[nPlug]!=0) { - if (pSndFile->m_MixPlugins[nPlug].Info.dwOutputRouting & 0x80) { + if (usedmap[nPlug]!=0) + { + if (pSndFile->m_MixPlugins[nPlug].Info.dwOutputRouting & 0x80) + { int output = pSndFile->m_MixPlugins[nPlug].Info.dwOutputRouting & 0x7f; usedmap[output] = true; } @@ -872,7 +879,7 @@ UINT nRemoved = m_pModDoc->RemovePlugs(usedmap); - return (nRemoved > 0) ? true : false; + return (nRemoved > 0); } @@ -908,7 +915,7 @@ pSndFile->m_nRestartPos = 0; // reset instruments (if there are any) - for(INSTRUMENTINDEX i = 1; i <= pSndFile->m_nInstruments; i++) + for(INSTRUMENTINDEX i = 1; i <= pSndFile->m_nInstruments; i++) if(pSndFile->Instruments[i]) { pSndFile->Instruments[i]->nFadeOut = 256; pSndFile->Instruments[i]->nGlobalVol = 64; Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2010-03-26 23:11:20 UTC (rev 555) @@ -652,8 +652,13 @@ if (m_pModDoc) { MODINSTRUMENT *pIns = m_pModDoc->GetSoundFile()->Instruments[m_nInstrument]; - if (m_bIns) m_nOldIns = pIns->Keyboard[m_nNote]; - else m_nOldNote = pIns->NoteMap[m_nNote]; + if(pIns) + { + if (m_bIns) + m_nOldIns = pIns->Keyboard[m_nNote]; + else + m_nOldNote = pIns->NoteMap[m_nNote]; + } } return true; } @@ -2626,10 +2631,10 @@ { if (m_pModDoc == 0 || m_pSndFile == 0 || m_nInstrument > m_pSndFile->GetNumInstruments() - || m_pSndFile->Instruments[m_nInstrument] == NULL) return; + || m_pSndFile->Instruments[m_nInstrument] == nullptr) return; MODINSTRUMENT* const pIns = m_pSndFile->Instruments[m_nInstrument]; - if(pIns->pTuning == NULL) + if(pIns->pTuning == nullptr) { m_ComboTuning.SetCurSel(0); return; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2010-03-26 23:11:20 UTC (rev 555) @@ -285,9 +285,8 @@ { for (UINT i=1; i<=m_pSndFile->m_nInstruments; i++) { - if (m_pSndFile->Instruments[i] == NULL) { + if (m_pSndFile->Instruments[i] == nullptr) continue; - } CString sDisplayName; if (m_pModDoc->GetSplitKeyboardSettings()->IsSplitActive()) @@ -1180,7 +1179,7 @@ void CCtrlPatterns::TogglePluginEditor() //-------------------------------------- { - if ((m_nInstrument) && (m_pModDoc)) + if(m_nInstrument && m_pModDoc && m_pSndFile && m_pSndFile->Instruments[m_nInstrument]) { UINT nPlug = m_pSndFile->Instruments[m_nInstrument]->nMixPlug; if (nPlug) //if not no plugin Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-03-26 23:11:20 UTC (rev 555) @@ -3515,7 +3515,7 @@ // If instrument name is empty, use name of the sample mapped to C-5. if (instrumentName.IsEmpty()) { - const SAMPLEINDEX nSmp = m_SndFile.Instruments[nInstr]->Keyboard[60]; + const SAMPLEINDEX nSmp = m_SndFile.Instruments[nInstr]->Keyboard[NOTE_MIDDLEC - 1]; if (nSmp < ARRAYELEMCOUNT(m_SndFile.Samples) && m_SndFile.Samples[nSmp].pSample) instrumentName.Format(TEXT("s: %s"), m_SndFile.GetSampleName(nSmp)); //60 is C-5 } Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-03-26 23:11:20 UTC (rev 555) @@ -154,7 +154,7 @@ for (UINT i2=0; i2<m_SndFile.m_nInstruments; i2++) if (m_SndFile.Instruments[i2]) { delete m_SndFile.Instruments[i2]; - m_SndFile.Instruments[i2] = NULL; + m_SndFile.Instruments[i2] = nullptr; } m_SndFile.m_nInstruments = 0; END_CRITICAL(); @@ -1387,8 +1387,8 @@ } } // Effect value - if (s[9] > ' ' && (!doMixPaste || ((!doITStyleMix && origModCmd.param==0) || - (doITStyleMix && origModCmd.command==0 && origModCmd.param==0)))) + if (s[9] > ' ' && (!doMixPaste || ((!doITStyleMix && (origModCmd.command == CMD_NONE || origModCmd.param == 0)) || + (doITStyleMix && origModCmd.command == CMD_NONE && origModCmd.param == 0)))) { m[col].param = 0; if (s[9] != '.') Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2010-03-26 23:11:20 UTC (rev 555) @@ -350,13 +350,8 @@ bool CViewInstrument::EnvGetVolEnv() const //---------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) return (pIns->VolEnv.dwFlags & ENV_ENABLED) ? true : false; - } + MODINSTRUMENT *pIns = GetInstrumentPtr(); + if (pIns) return (pIns->VolEnv.dwFlags & ENV_ENABLED) ? true : false; return false; } @@ -364,13 +359,8 @@ bool CViewInstrument::EnvGetPanEnv() const //---------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) return (pIns->PanEnv.dwFlags & ENV_ENABLED) ? true : false; - } + MODINSTRUMENT *pIns = GetInstrumentPtr(); + if (pIns) return (pIns->PanEnv.dwFlags & ENV_ENABLED) ? true : false; return false; } @@ -378,13 +368,8 @@ bool CViewInstrument::EnvGetPitchEnv() const //------------------------------------------ { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == ENV_ENABLED) ? true : false; - } + MODINSTRUMENT *pIns = GetInstrumentPtr(); + if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == ENV_ENABLED) ? true : false; return false; } @@ -392,13 +377,8 @@ bool CViewInstrument::EnvGetFilterEnv() const //------------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if (pModDoc) - { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; - if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == (ENV_ENABLED|ENV_FILTER)) ? true : false; - } + MODINSTRUMENT *pIns = GetInstrumentPtr(); + if (pIns) return ((pIns->PitchEnv.dwFlags & (ENV_ENABLED|ENV_FILTER)) == (ENV_ENABLED|ENV_FILTER)) ? true : false; return false; } @@ -559,12 +539,9 @@ bool CViewInstrument::EnvSetVolEnv(bool bEnable) //---------------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if(pModDoc == nullptr) return false; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - if(pSndFile == nullptr) return false; - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + MODINSTRUMENT *pIns = GetInstrumentPtr(); if(pIns == nullptr) return false; + CSoundFile *pSndFile = GetDocument()->GetSoundFile(); // security checks are done in GetInstrumentPtr() return EnvToggleEnv(&pIns->VolEnv, pSndFile, pIns, bEnable, 64, CHN_VOLENV); } @@ -573,12 +550,9 @@ bool CViewInstrument::EnvSetPanEnv(bool bEnable) //---------------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if(pModDoc == nullptr) return false; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - if(pSndFile == nullptr) return false; - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + MODINSTRUMENT *pIns = GetInstrumentPtr(); if(pIns == nullptr) return false; + CSoundFile *pSndFile = GetDocument()->GetSoundFile(); // security checks are done in GetInstrumentPtr() return EnvToggleEnv(&pIns->PanEnv, pSndFile, pIns, bEnable, 32, CHN_PANENV); } @@ -587,12 +561,9 @@ bool CViewInstrument::EnvSetPitchEnv(bool bEnable) //------------------------------------------------ { - CModDoc *pModDoc = GetDocument(); - if(pModDoc == nullptr) return false; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - if(pSndFile == nullptr) return false; - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + MODINSTRUMENT *pIns = GetInstrumentPtr(); if(pIns == nullptr) return false; + CSoundFile *pSndFile = GetDocument()->GetSoundFile(); // security checks are done in GetInstrumentPtr() pIns->PitchEnv.dwFlags &= ~ENV_FILTER; return EnvToggleEnv(&pIns->PitchEnv, pSndFile, pIns, bEnable, 32, CHN_PITCHENV); @@ -602,12 +573,9 @@ bool CViewInstrument::EnvSetFilterEnv(bool bEnable) //------------------------------------------------- { - CModDoc *pModDoc = GetDocument(); - if(pModDoc == nullptr) return false; - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - if(pSndFile == nullptr) return false; - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + MODINSTRUMENT *pIns = GetInstrumentPtr(); if(pIns == nullptr) return false; + CSoundFile *pSndFile = GetDocument()->GetSoundFile(); // security checks are done in GetInstrumentPtr() pIns->PitchEnv.dwFlags &= ~ENV_FILTER; return EnvToggleEnv(&pIns->PitchEnv, pSndFile, pIns, bEnable, 64, CHN_PITCHENV, ENV_FILTER); @@ -2435,16 +2403,23 @@ } -// Get a pointer to the currently selected envelope. -INSTRUMENTENVELOPE *CViewInstrument::GetEnvelopePtr() const -//--------------------------------------------------------- +// Get a pointer to the currently active instrument. +MODINSTRUMENT *CViewInstrument::GetInstrumentPtr() const +//------------------------------------------------------ { - // First do some standard checks... CModDoc *pModDoc = GetDocument(); if(pModDoc == nullptr) return nullptr; CSoundFile *pSndFile = pModDoc->GetSoundFile(); if(pSndFile == nullptr) return nullptr; - MODINSTRUMENT *pIns = pSndFile->Instruments[m_nInstrument]; + return pSndFile->Instruments[m_nInstrument]; +} + +// Get a pointer to the currently selected envelope. +INSTRUMENTENVELOPE *CViewInstrument::GetEnvelopePtr() const +//--------------------------------------------------------- +{ + // First do some standard checks... + MODINSTRUMENT *pIns = GetInstrumentPtr(); if(pIns == nullptr) return nullptr; // Now for the real thing. Modified: trunk/OpenMPT/mptrack/View_ins.h =================================================================== --- trunk/OpenMPT/mptrack/View_ins.h 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/mptrack/View_ins.h 2010-03-26 23:11:20 UTC (rev 555) @@ -117,6 +117,7 @@ // Misc stuff void UpdateScrollSize(); BOOL SetCurrentInstrument(INSTRUMENTINDEX nIns, enmEnvelopeTypes m_nEnv = ENV_VOLUME); + MODINSTRUMENT *GetInstrumentPtr() const; INSTRUMENTENVELOPE *GetEnvelopePtr() const; UINT EnvInsertPoint(int nTick, int nValue); bool EnvRemovePoint(UINT nPoint); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-03-26 23:11:20 UTC (rev 555) @@ -409,7 +409,7 @@ BOOL CModTypeDlg::VerifyData() -//--------------------------------- +//---------------------------- { int temp_nRPB = GetDlgItemInt(IDC_ROWSPERBEAT); @@ -2735,9 +2735,8 @@ if (m_pSndFile->m_nInstruments) { for (INSTRUMENTINDEX nIns = 1; nIns <= m_pSndFile->m_nInstruments; nIns++) { - if (m_pSndFile->Instruments[nIns] == nullptr) { + if (m_pSndFile->Instruments[nIns] == nullptr) continue; - } CString displayName = m_pSndFile->GetpModDoc()->GetPatternViewInstrumentName(nIns); int n = m_CbnSplitInstrument.AddString(displayName); Modified: trunk/OpenMPT/soundlib/Sampleio.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sampleio.cpp 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/soundlib/Sampleio.cpp 2010-03-26 23:11:20 UTC (rev 555) @@ -120,8 +120,8 @@ // -! NEW_FEATURE#0023 MODINSTRUMENT *pIns = Instruments[nInstr]; - Instruments[nInstr] = NULL; - for (UINT i=0; i<MAX_CHANNELS; i++) + Instruments[nInstr] = nullptr; + for(CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) { if (Chn[i].pModInstrument == pIns) { Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-03-26 23:00:54 UTC (rev 554) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-03-26 23:11:20 UTC (rev 555) @@ -860,10 +860,10 @@ pSmp->pSample = nullptr; } } - for (i=0; i<MAX_INSTRUMENTS; i++) + for (i = 0; i < MAX_INSTRUMENTS; i++) { delete Instruments[i]; - Instruments[i] = NULL; + Instruments[i] = nullptr; } for (i=0; i<MAX_MIXPLUGINS; i++) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |