From: <sag...@us...> - 2011-09-29 20:59:36
|
Revision: 1065 http://modplug.svn.sourceforge.net/modplug/?rev=1065&view=rev Author: saga-games Date: 2011-09-29 20:59:29 +0000 (Thu, 29 Sep 2011) Log Message: ----------- [Ref] Various refactoring in view_pat [Imp] Pattern Editor: Context menu entry for effect column is now adjusted when interpolating PC notes. Modified Paths: -------------- trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-09-28 21:04:23 UTC (rev 1064) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-09-29 20:59:29 UTC (rev 1065) @@ -141,7 +141,6 @@ m_pRandomizer = NULL; m_bLastNoteEntryBlocked=false; - m_nMenuOnChan = 0; m_nPattern = 0; m_nDetailLevel = 4; m_pEditWnd = NULL; @@ -192,8 +191,8 @@ } -BOOL CViewPattern::SetCurrentPattern(UINT npat, ROWINDEX nrow) -//------------------------------------------------------------ +BOOL CViewPattern::SetCurrentPattern(PATTERNINDEX npat, ROWINDEX nrow) +//-------------------------------------------------------------------- { CSoundFile *pSndFile; CModDoc *pModDoc = GetDocument(); @@ -641,7 +640,7 @@ if ((pMsg->message == WM_SYSKEYUP) || (pMsg->message == WM_KEYUP) || (pMsg->message == WM_SYSKEYDOWN) || (pMsg->message == WM_KEYDOWN)) { - CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); + CInputHandler *ih = (CMainFrame::GetMainFrame())->GetInputHandler(); //Translate message manually UINT nChar = pMsg->wParam; @@ -1321,7 +1320,7 @@ if ((nChn < pSndFile->GetNumChannels()) && (pSndFile->Patterns[m_nPattern])) { CString MenuText; - CInputHandler* ih = (CMainFrame::GetMainFrame())->GetInputHandler(); + CInputHandler *ih = (CMainFrame::GetMainFrame())->GetInputHandler(); //------ Plugin Header Menu --------- : if ((m_dwStatus & PATSTATUS_PLUGNAMESINHEADERS) && @@ -1531,7 +1530,7 @@ { const CHANNELINDEX nChn = GetChanFromCursor(m_nMenuParam); CModDoc *pModDoc = GetDocument(); - CSoundFile* pSndFile; + CSoundFile *pSndFile; if (pModDoc == 0 || (pSndFile = pModDoc->GetSoundFile()) == 0) return; const bool bIsMuted = pModDoc->IsChannelMuted(nChn); @@ -1871,7 +1870,7 @@ } if (m_pGotoWnd) { - CSoundFile* pSndFile = pModDoc->GetSoundFile(); + CSoundFile *pSndFile = pModDoc->GetSoundFile(); UINT nCurrentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); UINT nCurrentChannel = GetChanFromCursor(m_dwCursor) + 1; @@ -2739,7 +2738,7 @@ //---------------------------------- { CModDoc *pModDoc = GetDocument(); - CSoundFile* pSndFile; + CSoundFile *pSndFile; if (pModDoc == nullptr || (pSndFile = pModDoc->GetSoundFile()) == nullptr) return; if(pSndFile->m_nChannels <= pSndFile->GetModSpecifications().channelsMin) @@ -3108,10 +3107,9 @@ if ((!pModDoc) || (!pnotify)) return 0; if (pnotify->dwType & MPTNOTIFY_POSITION) { - UINT nOrd = pnotify->nOrder; - UINT nRow = pnotify->nRow; - //UINT nPat = 0xFFFF; - UINT nPat = pnotify->nPattern; //get player pattern + ORDERINDEX nOrd = pnotify->nOrder; + ROWINDEX nRow = pnotify->nRow; + PATTERNINDEX nPat = pnotify->nPattern; //get player pattern CSoundFile *pSndFile = pModDoc->GetSoundFile(); bool updateOrderList = false; @@ -3146,7 +3144,7 @@ if (nOrd >= pSndFile->Order.GetLength() || pSndFile->Order[nOrd] != nPat) { //order doesn't correlate with pattern, so mark it as invalid - nOrd = 0xFFFF; + nOrd = ORDERINDEX_INVALID; } if (m_pEffectVis && m_pEffectVis->m_hWnd) @@ -3198,7 +3196,6 @@ //------------------------------------------------------------------------------- { CModDoc *pModDoc = GetDocument(); - //if (!m_bRecord || !pModDoc) { if (!IsEditingEnabled() || !pModDoc) { return 0; @@ -3321,7 +3318,7 @@ if ((!pModDoc) || (!pMainFrm)) return 0; - CSoundFile* pSndFile = pModDoc->GetSoundFile(); + CSoundFile *pSndFile = pModDoc->GetSoundFile(); if(!pSndFile) return 0; //Midi message from our perspective: @@ -4252,18 +4249,18 @@ if(usePlaybackPosition) SetEditPos(*pSndFile, nRow, nPat, nRowPlayback, nPatPlayback); - MODCOMMAND* p = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + MODCOMMAND* pTarget = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); //don't overwrite: - if (p->note || p->instr || p->volcmd) + if (pTarget->note || pTarget->instr || pTarget->volcmd) { //if there's a note in the current location and the song is playing and following, //the user probably just tapped the key - let's try the next row down. nRow++; - if (p->note==note && bIsLiveRecord && pSndFile->Patterns[nPat].IsValidRow(nRow)) + if (pTarget->note==note && bIsLiveRecord && pSndFile->Patterns[nPat].IsValidRow(nRow)) { - p = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); - if (p->note || (!bChordMode && (p->instr || p->volcmd)) ) + pTarget = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); + if (pTarget->note || (!bChordMode && (pTarget->instr || pTarget->volcmd)) ) return; } else @@ -4275,33 +4272,33 @@ // -- write sdx if playing live if (usePlaybackPosition && nTick) { // avoid SD0 which will be mis-interpreted - if (p->command == 0) { //make sure we don't overwrite any existing commands. - p->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; - p->param = 0xD0 | min(0xF, nTick); + if (pTarget->command == 0) { //make sure we don't overwrite any existing commands. + pTarget->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; + pTarget->param = 0xD0 | min(0xF, nTick); } } //Enter note off if(pSndFile->GetModSpecifications().hasNoteOff) // === - p->note = NOTE_KEYOFF; + pTarget->note = NOTE_KEYOFF; else if(pSndFile->GetModSpecifications().hasNoteCut) // ^^^ - p->note = NOTE_NOTECUT; + pTarget->note = NOTE_NOTECUT; else { // we don't have anything to cut (MOD format) - use volume or ECx if(usePlaybackPosition && nTick) // ECx { - p->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; - p->param = 0xC0 | min(0xF, nTick); + pTarget->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; + pTarget->param = 0xC0 | min(0xF, nTick); } else // C00 { - p->note = NOTE_NONE; - p->command = CMD_VOLUME; - p->param = 0; + pTarget->note = NOTE_NONE; + pTarget->command = CMD_VOLUME; + pTarget->param = 0; } } - p->instr = (bChordMode) ? 0 : ins; //p->instr = 0; + pTarget->instr = (bChordMode) ? 0 : ins; //p->instr = 0; //Writing the instrument as well - probably someone finds this annoying :) - p->volcmd = 0; - p->vol = 0; + pTarget->volcmd = VOLCMD_NONE; + pTarget->vol = 0; pModDoc->SetModified(); @@ -4332,8 +4329,8 @@ UINT nChn = GetChanFromCursor(m_dwCursor); PrepareUndo(m_dwBeginSel, m_dwEndSel); - MODCOMMAND* p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, nChn); - MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite + MODCOMMAND* pTarget = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, nChn); + MODCOMMAND oldcmd = *pTarget; // This is the command we are about to overwrite if (oldcmd.note) { TempEnterNote(((oldcmd.note - 1) % 12) + val * 12 + 1); @@ -4358,11 +4355,11 @@ UINT nChn = GetChanFromCursor(m_dwCursor); PrepareUndo(m_dwBeginSel, m_dwEndSel); - MODCOMMAND *p = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, nChn); - MODCOMMAND oldcmd = *p; // This is the command we are about to overwrite + MODCOMMAND *pTarget = pSndFile->Patterns[m_nPattern].GetpModCommand(m_nRow, nChn); + MODCOMMAND oldcmd = *pTarget; // This is the command we are about to overwrite - UINT instr = p->instr, nTotalMax, nTempMax; - if(p->IsPcNote()) // this is a plugin index + UINT instr = pTarget->instr, nTotalMax, nTempMax; + if(pTarget->IsPcNote()) // this is a plugin index { nTotalMax = MAX_MIXPLUGINS + 1; nTempMax = MAX_MIXPLUGINS + 1; @@ -4381,28 +4378,28 @@ if (nTempMax < 100) // if we're using samples & have less than 100 samples instr = instr % 100; // or if we're using instruments and have less than 100 instruments // --> ensure the entered instrument value is less than 100. - p->instr = instr; + pTarget->instr = instr; if (IsEditingEnabled_bmsg()) { DWORD sel = CreateCursor(m_nRow) | m_dwCursor; SetCurSel(sel, sel); sel &= ~7; - if(*p != oldcmd) + if(*pTarget != oldcmd) { pModDoc->SetModified(); InvalidateArea(sel, sel + LAST_COLUMN); UpdateIndicator(); } - if(p->IsPcNote()) + if(pTarget->IsPcNote()) { - m_PCNoteEditMemory = *p; + m_PCNoteEditMemory = *pTarget; } } else { // recording disabled - *p = oldcmd; + *pTarget = oldcmd; } } } @@ -4417,7 +4414,6 @@ if ((pModDoc) && (pMainFrm)) { - bool modified = false; ROWINDEX nRow = m_nRow; CSoundFile *pSndFile = pModDoc->GetSoundFile(); const ROWINDEX nRowPlayback = pSndFile->m_nRow; @@ -4427,10 +4423,10 @@ const bool bRecordEnabled = IsEditingEnabled(); const CHANNELINDEX nChn = GetChanFromCursor(m_dwCursor); - if(note > pSndFile->GetModSpecifications().noteMax && note < NOTE_MIN_SPECIAL) - note = pSndFile->GetModSpecifications().noteMax; - else if( note < pSndFile->GetModSpecifications().noteMin) - note = pSndFile->GetModSpecifications().noteMin; + if(note < NOTE_MIN_SPECIAL) + { + Limit(note, pSndFile->GetModSpecifications().noteMin, pSndFile->GetModSpecifications().noteMax); + } // Special case: Convert note off commands to C00 for MOD files if((pSndFile->GetType() == MOD_TYPE_MOD) && (note == NOTE_NOTECUT || note == NOTE_FADE || note == NOTE_KEYOFF)) @@ -4440,10 +4436,12 @@ } // Check whether the module format supports the note. - if( pSndFile->GetModSpecifications().HasNote(note) == false ) + if(pSndFile->GetModSpecifications().HasNote(note) == false) + { return; + } - BYTE recordGroup = pModDoc->IsChannelRecord(nChn); + const BYTE recordGroup = pModDoc->IsChannelRecord(nChn); const bool bIsLiveRecord = IsLiveRecord(*pMainFrm, *pModDoc, *pSndFile); const bool usePlaybackPosition = (bIsLiveRecord && (CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_AUTODELAY) && !(pSndFile->m_dwSongFlags & SONG_STEP)); bool isSplit = false; @@ -4470,30 +4468,20 @@ MODCOMMAND *pTarget = pSndFile->Patterns[nPat].GetpModCommand(nRow, nChn); MODCOMMAND newcmd = *pTarget; - // If record is enabled, create undo point. - if(bRecordEnabled) - { - pModDoc->GetPatternUndo()->PrepareUndo(nPat, nChn, nRow, 1, 1); - } - // Param control 'note' if(MODCOMMAND::IsPcNote(note)) { - if(bRecordEnabled) + if(!pTarget->IsPcNote()) { - if(!pTarget->IsPcNote()) - { - // We're overwriting a normal cell with a PC note. - newcmd = m_PCNoteEditMemory; - } else - { - // Just update PC note edit memory. - m_PCNoteEditMemory = newcmd; - } - - newcmd.note = note; - modified = true; + // We're overwriting a normal cell with a PC note. + newcmd = m_PCNoteEditMemory; + } else if(bRecordEnabled) + { + // Pick up current entry to update PC note edit memory. + m_PCNoteEditMemory = newcmd; } + + newcmd.note = note; } else { @@ -4558,11 +4546,12 @@ } - // -- if recording, write out modified command. - if (bRecordEnabled && *pTarget != newcmd) + // -- if recording, create undo point and write out modified command. + const bool modified = (bRecordEnabled && *pTarget != newcmd); + if (modified) { + pModDoc->GetPatternUndo()->PrepareUndo(nPat, nChn, nRow, 1, 1); *pTarget = newcmd; - modified = true; } @@ -4583,15 +4572,15 @@ // just play the newly inserted note using the already specified instrument... UINT nPlayIns = newcmd.instr; - if(!nPlayIns && (note <= NOTE_MAX)) + if(!nPlayIns && NOTE_IS_VALID(note)) { // ...or one that can be found on a previous row of this pattern. MODCOMMAND *search = pTarget; - UINT srow = nRow; - while (srow-- > 0) + ROWINDEX srow = nRow; + while(srow-- > 0) { - search -= pSndFile->m_nChannels; - if (search->instr) + search -= pSndFile->GetNumChannels(); + if (search->instr && !search->IsPcNote()) { nPlayIns = search->instr; m_nFoundInstrument = nPlayIns; //used to figure out which instrument to stop on key release. @@ -4600,8 +4589,7 @@ } } BOOL bNotPlaying = ((pMainFrm->GetModPlaying() == pModDoc) && (pMainFrm->IsPlaying())) ? FALSE : TRUE; - //pModDoc->PlayNote(p->note, nPlayIns, 0, bNotPlaying, -1, 0, 0, nChn); //rewbs.vstiLive - added extra args - pModDoc->PlayNote(newcmd.note, nPlayIns, 0, bNotPlaying, 4*vol, 0, 0, nChn); //rewbs.vstiLive - added extra args + pModDoc->PlayNote(newcmd.note, nPlayIns, 0, bNotPlaying, 4 * vol, 0, 0, nChn); } } @@ -4948,7 +4936,7 @@ int plug = pSndFile->ChnSettings[chan].nMixPlugin; if (plug > 0) - pModDoc->TogglePluginEditor(plug-1); + pModDoc->TogglePluginEditor(plug - 1); return; } @@ -5004,12 +4992,13 @@ CModDoc *pModDoc = GetDocument(); if (!pModDoc) return; CSoundFile *pSndFile = pModDoc->GetSoundFile(); if (!pSndFile) return; - if (m_nMenuOnChan) + const CHANNELINDEX plugChannel = GetChanFromCursor(m_nMenuParam); + if (plugChannel < pSndFile->GetNumChannels()) { - UINT newPlug = nID-ID_PLUGSELECT; - if (newPlug <= MAX_MIXPLUGINS && newPlug != pSndFile->ChnSettings[m_nMenuOnChan-1].nMixPlugin) + UINT newPlug = nID - ID_PLUGSELECT; + if (newPlug <= MAX_MIXPLUGINS && newPlug != pSndFile->ChnSettings[plugChannel].nMixPlugin) { - pSndFile->ChnSettings[m_nMenuOnChan-1].nMixPlugin = newPlug; + pSndFile->ChnSettings[plugChannel].nMixPlugin = newPlug; if(pSndFile->GetModSpecifications().supportsPlugins) pModDoc->SetModified(); InvalidateChannelsHeaders(); @@ -5051,24 +5040,24 @@ return isSplit; } -bool CViewPattern::BuildPluginCtxMenu(HMENU hMenu, UINT nChn, CSoundFile* pSndFile) -//--------------------------------------------------------------------------------- +bool CViewPattern::BuildPluginCtxMenu(HMENU hMenu, UINT nChn, CSoundFile *pSndFile) const +//--------------------------------------------------------------------------------------- { - CHAR s[512]; bool itemFound; for (UINT plug=0; plug<=MAX_MIXPLUGINS; plug++) { itemFound=false; - s[0] = 0; + CHAR s[64] = { '\0' }; + if (!plug) { strcpy(s, "No plugin"); itemFound=true; } else { - PSNDMIXPLUGIN p = &(pSndFile->m_MixPlugins[plug-1]); + PSNDMIXPLUGIN p = &(pSndFile->m_MixPlugins[plug - 1]); if (p->Info.szLibraryName[0]) { wsprintf(s, "FX%d: %s", plug, p->Info.szName); @@ -5078,21 +5067,20 @@ if (itemFound) { - m_nMenuOnChan = nChn + 1; if (plug == pSndFile->ChnSettings[nChn].nMixPlugin) { - AppendMenu(hMenu, (MF_STRING|MF_CHECKED), ID_PLUGSELECT+plug, s); + AppendMenu(hMenu, (MF_STRING | MF_CHECKED), ID_PLUGSELECT + plug, s); } else { - AppendMenu(hMenu, MF_STRING, ID_PLUGSELECT+plug, s); + AppendMenu(hMenu, MF_STRING, ID_PLUGSELECT + plug, s); } } } return true; } -bool CViewPattern::BuildSoloMuteCtxMenu(HMENU hMenu, CInputHandler* ih, UINT nChn, CSoundFile* pSndFile) -//------------------------------------------------------------------------------------------------------ +bool CViewPattern::BuildSoloMuteCtxMenu(HMENU hMenu, CInputHandler *ih, UINT nChn, CSoundFile *pSndFile) const +//------------------------------------------------------------------------------------------------------------ { AppendMenu(hMenu, (pSndFile->ChnSettings[nChn].dwFlags & CHN_MUTE) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_PATTERN_MUTE, @@ -5133,8 +5121,8 @@ return true; } -bool CViewPattern::BuildRecordCtxMenu(HMENU hMenu, UINT nChn, CModDoc* pModDoc) -//----------------------------------------------------------------------------- +bool CViewPattern::BuildRecordCtxMenu(HMENU hMenu, UINT nChn, CModDoc* pModDoc) const +//----------------------------------------------------------------------------------- { AppendMenu(hMenu, pModDoc->IsChannelRecord1(nChn) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_EDIT_RECSELECT, "Record select"); AppendMenu(hMenu, pModDoc->IsChannelRecord2(nChn) ? (MF_STRING|MF_CHECKED) : MF_STRING, ID_EDIT_SPLITRECSELECT, "Split Record select"); @@ -5143,8 +5131,8 @@ -bool CViewPattern::BuildRowInsDelCtxMenu(HMENU hMenu, CInputHandler* ih) -//---------------------------------------------------------------------- +bool CViewPattern::BuildRowInsDelCtxMenu(HMENU hMenu, CInputHandler *ih) const +//---------------------------------------------------------------------------- { const CString label = (GetSelectionStartRow() != GetSelectionEndRow() ? "Rows" : "Row"); @@ -5153,31 +5141,31 @@ return true; } -bool CViewPattern::BuildMiscCtxMenu(HMENU hMenu, CInputHandler* ih) -//----------------------------------------------------------------- +bool CViewPattern::BuildMiscCtxMenu(HMENU hMenu, CInputHandler *ih) const +//----------------------------------------------------------------------- { AppendMenu(hMenu, MF_STRING, ID_SHOWTIMEATROW, "Show row play time\t" + ih->GetKeyTextFromCommand(kcTimeAtRow)); return true; } -bool CViewPattern::BuildSelectionCtxMenu(HMENU hMenu, CInputHandler* ih) -//---------------------------------------------------------------------- +bool CViewPattern::BuildSelectionCtxMenu(HMENU hMenu, CInputHandler *ih) const +//---------------------------------------------------------------------------- { AppendMenu(hMenu, MF_STRING, ID_EDIT_SELECTCOLUMN, "Select Column\t" + ih->GetKeyTextFromCommand(kcSelectColumn)); AppendMenu(hMenu, MF_STRING, ID_EDIT_SELECT_ALL, "Select Pattern\t" + ih->GetKeyTextFromCommand(kcEditSelectAll)); return true; } -bool CViewPattern::BuildGrowShrinkCtxMenu(HMENU hMenu, CInputHandler* ih) -//---------------------------------------------------------------------- +bool CViewPattern::BuildGrowShrinkCtxMenu(HMENU hMenu, CInputHandler *ih) const +//----------------------------------------------------------------------------- { AppendMenu(hMenu, MF_STRING, ID_GROW_SELECTION, "Grow selection\t" + ih->GetKeyTextFromCommand(kcPatternGrowSelection)); AppendMenu(hMenu, MF_STRING, ID_SHRINK_SELECTION, "Shrink selection\t" + ih->GetKeyTextFromCommand(kcPatternShrinkSelection)); return true; } -bool CViewPattern::BuildNoteInterpolationCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile) -//---------------------------------------------------------------------------------------------------- +bool CViewPattern::BuildNoteInterpolationCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const +//---------------------------------------------------------------------------------------------------------- { CArray<UINT, UINT> validChans; DWORD greyed = MF_GRAYED; @@ -5198,16 +5186,16 @@ } } - if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup&PATTERN_OLDCTXMENUSTYLE)) + if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE)) { - AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_INTERPOLATE_NOTE, "Interpolate Note\t" + ih->GetKeyTextFromCommand(kcPatternInterpolateNote)); + AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_INTERPOLATE_NOTE, "Interpolate Note\t" + ih->GetKeyTextFromCommand(kcPatternInterpolateNote)); return true; } return false; } -bool CViewPattern::BuildVolColInterpolationCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile) -//------------------------------------------------------------------------------------------------------ +bool CViewPattern::BuildVolColInterpolationCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const +//------------------------------------------------------------------------------------------------------------ { CArray<UINT, UINT> validChans; DWORD greyed = MF_GRAYED; @@ -5217,7 +5205,7 @@ if (ListChansWhereColSelected(VOL_COLUMN, validChans) > 0) { - for (int valChnIdx=0; valChnIdx<validChans.GetCount(); valChnIdx++) + for (int valChnIdx = 0; valChnIdx < validChans.GetCount(); valChnIdx++) { if (IsInterpolationPossible(startRow, endRow, validChans[valChnIdx], VOL_COLUMN, pSndFile)) @@ -5227,17 +5215,17 @@ } } } - if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup&PATTERN_OLDCTXMENUSTYLE)) + if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE)) { - AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_INTERPOLATE_VOLUME, "Interpolate Vol Col\t" + ih->GetKeyTextFromCommand(kcPatternInterpolateVol)); + AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_INTERPOLATE_VOLUME, "Interpolate Vol Col\t" + ih->GetKeyTextFromCommand(kcPatternInterpolateVol)); return true; } return false; } -bool CViewPattern::BuildEffectInterpolationCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile) -//------------------------------------------------------------------------------------------------------ +bool CViewPattern::BuildEffectInterpolationCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const +//------------------------------------------------------------------------------------------------------------ { CArray<UINT, UINT> validChans; DWORD greyed = MF_GRAYED; @@ -5247,11 +5235,11 @@ if (ListChansWhereColSelected(EFFECT_COLUMN, validChans) > 0) { - for (int valChnIdx=0; valChnIdx<validChans.GetCount(); valChnIdx++) + for (int valChnIdx = 0; valChnIdx < validChans.GetCount(); valChnIdx++) { if (IsInterpolationPossible(startRow, endRow, validChans[valChnIdx], EFFECT_COLUMN, pSndFile)) { - greyed=0; //Can do interpolation. + greyed = 0; // Can do interpolation. break; } } @@ -5263,23 +5251,31 @@ { if (IsInterpolationPossible(startRow, endRow, validChans[valChnIdx], EFFECT_COLUMN, pSndFile)) { - greyed = 0; //Can do interpolation. + greyed = 0; // Can do interpolation. break; } } } - if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup&PATTERN_OLDCTXMENUSTYLE)) + if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE)) { - AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_INTERPOLATE_EFFECT, "Interpolate Effect\t" + ih->GetKeyTextFromCommand(kcPatternInterpolateEffect)); + // Figure out what we want to interpolate + CString interpolateWhat = "Effect"; + const CSoundFile *pSndFile = GetDocument() != nullptr ? GetDocument()->GetSoundFile() : nullptr; + if(pSndFile->Patterns.IsValidPat(m_nPattern) && pSndFile->Patterns[m_nPattern].GetpModCommand(GetSelectionStartRow(), GetSelectionStartChan())->IsPcNote()) + { + interpolateWhat = "Parameter"; + } + + AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_INTERPOLATE_EFFECT, "Interpolate " + interpolateWhat + "\t" + ih->GetKeyTextFromCommand(kcPatternInterpolateEffect)); return true; } return false; } -bool CViewPattern::BuildEditCtxMenu(HMENU hMenu, CInputHandler* ih, CModDoc* pModDoc) -//----------------------------------------------------------------------------------- +bool CViewPattern::BuildEditCtxMenu(HMENU hMenu, CInputHandler *ih, CModDoc* pModDoc) const +//----------------------------------------------------------------------------------------- { HMENU pasteSpecialMenu = ::CreatePopupMenu(); AppendMenu(hMenu, MF_STRING, ID_EDIT_CUT, "Cut\t" + ih->GetKeyTextFromCommand(kcEditCut)); @@ -5302,31 +5298,32 @@ return true; } -bool CViewPattern::BuildVisFXCtxMenu(HMENU hMenu, CInputHandler* ih) -//------------------------------------------------------------------ +bool CViewPattern::BuildVisFXCtxMenu(HMENU hMenu, CInputHandler *ih) const +//------------------------------------------------------------------------ { CArray<UINT, UINT> validChans; - DWORD greyed = (ListChansWhereColSelected(EFFECT_COLUMN, validChans)>0)?FALSE:MF_GRAYED; + DWORD greyed = (ListChansWhereColSelected(EFFECT_COLUMN, validChans) > 0) ? FALSE:MF_GRAYED; - if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup&PATTERN_OLDCTXMENUSTYLE)) { + if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE)) + { AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_VISUALIZE_EFFECT, "Visualize Effect\t" + ih->GetKeyTextFromCommand(kcPatternVisualizeEffect)); return true; } return false; } -bool CViewPattern::BuildRandomCtxMenu(HMENU hMenu, CInputHandler* ih) -//------------------------------------------------------------------ +bool CViewPattern::BuildRandomCtxMenu(HMENU hMenu, CInputHandler *ih) const +//------------------------------------------------------------------------ { AppendMenu(hMenu, MF_STRING, ID_PATTERN_OPEN_RANDOMIZER, "Randomize...\t" + ih->GetKeyTextFromCommand(kcPatternOpenRandomizer)); return true; } -bool CViewPattern::BuildTransposeCtxMenu(HMENU hMenu, CInputHandler* ih) -//---------------------------------------------------------------------- +bool CViewPattern::BuildTransposeCtxMenu(HMENU hMenu, CInputHandler *ih) const +//---------------------------------------------------------------------------- { CArray<UINT, UINT> validChans; - DWORD greyed = (ListChansWhereColSelected(NOTE_COLUMN, validChans)>0)?FALSE:MF_GRAYED; + DWORD greyed = (ListChansWhereColSelected(NOTE_COLUMN, validChans) > 0) ? FALSE:MF_GRAYED; //AppendMenu(hMenu, MF_STRING, ID_RUN_SCRIPT, "Run script"); @@ -5341,23 +5338,23 @@ return false; } -bool CViewPattern::BuildAmplifyCtxMenu(HMENU hMenu, CInputHandler* ih) -//-------------------------------------------------------------------- +bool CViewPattern::BuildAmplifyCtxMenu(HMENU hMenu, CInputHandler *ih) const +//-------------------------------------------------------------------------- { CArray<UINT, UINT> validChans; - DWORD greyed = (ListChansWhereColSelected(VOL_COLUMN, validChans)>0)?FALSE:MF_GRAYED; + DWORD greyed = (ListChansWhereColSelected(VOL_COLUMN, validChans) > 0) ? 0 : MF_GRAYED; - if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup&PATTERN_OLDCTXMENUSTYLE)) + if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE)) { - AppendMenu(hMenu, MF_STRING|greyed, ID_PATTERN_AMPLIFY, "Amplify\t" + ih->GetKeyTextFromCommand(kcPatternAmplify)); + AppendMenu(hMenu, MF_STRING | greyed, ID_PATTERN_AMPLIFY, "Amplify\t" + ih->GetKeyTextFromCommand(kcPatternAmplify)); return true; } return false; } -bool CViewPattern::BuildChannelControlCtxMenu(HMENU hMenu) -//-------------------------------------------------------- +bool CViewPattern::BuildChannelControlCtxMenu(HMENU hMenu) const +//-------------------------------------------------------------- { AppendMenu(hMenu, MF_SEPARATOR, 0, ""); @@ -5378,11 +5375,11 @@ } -bool CViewPattern::BuildSetInstCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile) -//------------------------------------------------------------------------------------------ +bool CViewPattern::BuildSetInstCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const +//------------------------------------------------------------------------------------------------ { CArray<UINT, UINT> validChans; - DWORD greyed = (ListChansWhereColSelected(INST_COLUMN, validChans)>0)?FALSE:MF_GRAYED; + DWORD greyed = (ListChansWhereColSelected(INST_COLUMN, validChans) > 0) ? 0 : MF_GRAYED; if (!greyed || !(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_OLDCTXMENUSTYLE)) { @@ -5447,10 +5444,10 @@ } -bool CViewPattern::BuildChannelMiscCtxMenu(HMENU hMenu, CSoundFile* pSndFile) -//--------------------------------------------------------------------------- +bool CViewPattern::BuildChannelMiscCtxMenu(HMENU hMenu, CSoundFile *pSndFile) const +//--------------------------------------------------------------------------------- { - if((pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) == 0) return false; + if((pSndFile->GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)) == 0) return false; AppendMenu(hMenu, MF_SEPARATOR, 0, 0); AppendMenu(hMenu, MF_STRING, ID_CHANNEL_RENAME, "Rename channel"); return true; @@ -5458,8 +5455,8 @@ // Context menu for Param Control notes -bool CViewPattern::BuildPCNoteCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile) -//----------------------------------------------------------------------------------------- +bool CViewPattern::BuildPCNoteCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const +//----------------------------------------------------------------------------------------------- { MODCOMMAND *mSelStart = nullptr; if((pSndFile == nullptr) || (!pSndFile->Patterns.IsValidPat(m_nPattern))) @@ -5511,32 +5508,32 @@ } -ROWINDEX CViewPattern::GetSelectionStartRow() -//------------------------------------------- +ROWINDEX CViewPattern::GetSelectionStartRow() const +//------------------------------------------------- { return min(GetRowFromCursor(m_dwBeginSel), GetRowFromCursor(m_dwEndSel)); } -ROWINDEX CViewPattern::GetSelectionEndRow() -//----------------------------------------- +ROWINDEX CViewPattern::GetSelectionEndRow() const +//----------------------------------------------- { return max(GetRowFromCursor(m_dwBeginSel), GetRowFromCursor(m_dwEndSel)); } -CHANNELINDEX CViewPattern::GetSelectionStartChan() -//------------------------------------------------ +CHANNELINDEX CViewPattern::GetSelectionStartChan() const +//------------------------------------------------------ { return min(GetChanFromCursor(m_dwBeginSel), GetChanFromCursor(m_dwEndSel)); } -CHANNELINDEX CViewPattern::GetSelectionEndChan() -//---------------------------------------------- +CHANNELINDEX CViewPattern::GetSelectionEndChan() const +//---------------------------------------------------- { return max(GetChanFromCursor(m_dwBeginSel), GetChanFromCursor(m_dwEndSel)); } -UINT CViewPattern::ListChansWhereColSelected(PatternColumns colType, CArray<UINT,UINT> &chans) -//-------------------------------------------------------------------------------------------- +UINT CViewPattern::ListChansWhereColSelected(PatternColumns colType, CArray<UINT, UINT> &chans) const +//--------------------------------------------------------------------------------------------------- { chans.RemoveAll(); UINT startChan = GetSelectionStartChan(); @@ -5546,7 +5543,7 @@ { chans.Add(startChan); //first selected chan includes this col type } - for (UINT chan=startChan+1; chan<endChan; chan++) + for (UINT chan=startChan + 1; chan < endChan; chan++) { chans.Add(chan); //All chans between first & last must include this col type } @@ -5560,8 +5557,8 @@ bool CViewPattern::IsInterpolationPossible(ROWINDEX startRow, ROWINDEX endRow, CHANNELINDEX chan, - PatternColumns colType, CSoundFile* pSndFile) -//-------------------------------------------------------------------------------------- + PatternColumns colType, CSoundFile *pSndFile) const +//-------------------------------------------------------------------------------------------- { if (startRow == endRow) return false; @@ -5653,8 +5650,6 @@ CPoint pt = GetPointFromPosition(m_dwCursor); AppendMenu(hMenu, MF_STRING, IDC_PATTERN_RECORD, "Editing(record) is disabled; click here to enable it."); - //To check: It seems to work the way it should, but still is it ok to use IDC_PATTERN_RECORD here since it is not - //'aimed' to be used here. ClientToScreen(&pt); ::TrackPopupMenu(hMenu, TPM_LEFTALIGN, pt.x, pt.y, 0, m_hWnd, NULL); @@ -5669,7 +5664,7 @@ //---------------------------------- { CModDoc* pModDoc = GetDocument(); - CSoundFile* pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : 0; + CSoundFile *pSndFile = (pModDoc) ? pModDoc->GetSoundFile() : 0; if(!pSndFile) return; CString msg; @@ -5720,7 +5715,7 @@ CSoundFile *pSndFile = pModDoc->GetSoundFile(); if(pSndFile == nullptr) return; - CHANNELINDEX nChn = GetChanFromCursor(m_nMenuParam); + const CHANNELINDEX nChn = GetChanFromCursor(m_nMenuParam); CChannelRenameDlg dlg(this, pSndFile->ChnSettings[nChn].szName, nChn + 1); if(dlg.DoModal() != IDOK || dlg.bChanged == false) return; Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2011-09-28 21:04:23 UTC (rev 1064) +++ trunk/OpenMPT/mptrack/View_pat.h 2011-09-29 20:59:29 UTC (rev 1065) @@ -102,8 +102,9 @@ CEditCommand *m_pEditWnd; CPatternGotoDialog *m_pGotoWnd; SIZE m_szHeader, m_szCell; + PATTERNINDEX m_nPattern; ROWINDEX m_nRow; - UINT m_nPattern, m_nMidRow, m_nPlayPat, m_nPlayRow, m_nSpacing, m_nAccelChar, m_nLastPlayedRow, m_nLastPlayedOrder; + UINT m_nMidRow, m_nPlayPat, m_nPlayRow, m_nSpacing, m_nAccelChar, m_nLastPlayedRow, m_nLastPlayedOrder; int m_nXScroll, m_nYScroll; DWORD m_nMenuParam, m_nDetailLevel; @@ -121,7 +122,6 @@ WORD ChnVUMeters[MAX_BASECHANNELS]; WORD OldVUMeters[MAX_BASECHANNELS]; UINT m_nFoundInstrument; - UINT m_nMenuOnChan; DWORD m_dwLastNoteEntryTime; //rewbs.customkeys UINT m_nLastPlayedChannel; //rewbs.customkeys bool m_bLastNoteEntryBlocked; @@ -134,7 +134,7 @@ // -> DESC="midi keyboard split" BYTE activeNoteChannel[NOTE_MAX + 1]; BYTE splitActiveNoteChannel[NOTE_MAX + 1]; - int oldrow,oldchn,oldsplitchn; + int oldrow, oldchn, oldsplitchn; // -! NEW_FEATURE#0012 // -> CODE#0018 @@ -163,7 +163,7 @@ int GetYScrollPos() const { return m_nYScroll; } int GetColumnWidth() const { return m_szCell.cx; } int GetColumnHeight() const { return m_szCell.cy; } - UINT GetCurrentPattern() const { return m_nPattern; } + PATTERNINDEX GetCurrentPattern() const { return m_nPattern; } ROWINDEX GetCurrentRow() const { return m_nRow; } UINT GetCurrentColumn() const { return m_dwCursor; } UINT GetCurrentChannel() const { return (m_dwCursor >> 3); } @@ -180,7 +180,7 @@ void InvalidateSelection() { InvalidateArea(m_dwBeginSel, m_dwEndSel); } void InvalidateChannelsHeaders(); void SetCurSel(DWORD dwBegin, DWORD dwEnd); - BOOL SetCurrentPattern(UINT npat, ROWINDEX nrow = ROWINDEX_INVALID); + BOOL SetCurrentPattern(PATTERNINDEX npat, ROWINDEX nrow = ROWINDEX_INVALID); BOOL SetCurrentRow(UINT nrow, BOOL bWrap=FALSE, BOOL bUpdateHorizontalScrollbar=TRUE ); BOOL SetCurrentColumn(UINT ncol); // This should be used instead of consecutive calls to SetCurrentRow() then SetCurrentColumn() @@ -355,57 +355,66 @@ private: void SetSplitKeyboardSettings(); - bool HandleSplit(MODCOMMAND* p, int note); - bool BuildChannelControlCtxMenu(HMENU hMenu); - bool BuildPluginCtxMenu(HMENU hMenu, UINT nChn, CSoundFile* pSndFile); - bool BuildRecordCtxMenu(HMENU hMenu, UINT nChn, CModDoc* pModDoc); - bool BuildSoloMuteCtxMenu(HMENU hMenu, CInputHandler* ih, UINT nChn, CSoundFile* pSndFile); - bool BuildRowInsDelCtxMenu(HMENU hMenu, CInputHandler* ih); - bool BuildMiscCtxMenu(HMENU hMenu, CInputHandler* ih); - bool BuildSelectionCtxMenu(HMENU hMenu, CInputHandler* ih); - bool BuildGrowShrinkCtxMenu(HMENU hMenu, CInputHandler* ih); - bool BuildNoteInterpolationCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile); - bool BuildVolColInterpolationCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile); - bool BuildEffectInterpolationCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile); - bool BuildEditCtxMenu(HMENU hMenu, CInputHandler* ih, CModDoc* pModDoc); - bool BuildVisFXCtxMenu(HMENU hMenu, CInputHandler* ih); - bool BuildRandomCtxMenu(HMENU hMenu, CInputHandler* ih); - bool BuildTransposeCtxMenu(HMENU hMenu, CInputHandler* ih); - bool BuildSetInstCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile); - bool BuildAmplifyCtxMenu(HMENU hMenu, CInputHandler* ih); - bool BuildChannelMiscCtxMenu(HMENU hMenu, CSoundFile* pSndFile); - bool BuildPCNoteCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile); + bool HandleSplit(MODCOMMAND *p, int note); - ROWINDEX GetSelectionStartRow(); - ROWINDEX GetSelectionEndRow(); - CHANNELINDEX GetSelectionStartChan(); - CHANNELINDEX GetSelectionEndChan(); - UINT ListChansWhereColSelected(PatternColumns colType, CArray<UINT,UINT> &chans); + bool BuildChannelControlCtxMenu(HMENU hMenu) const; + bool BuildPluginCtxMenu(HMENU hMenu, UINT nChn, CSoundFile *pSndFile) const; + bool BuildRecordCtxMenu(HMENU hMenu, UINT nChn, CModDoc *pModDoc) const; + bool BuildSoloMuteCtxMenu(HMENU hMenu, CInputHandler *ih, UINT nChn, CSoundFile *pSndFile) const; + bool BuildRowInsDelCtxMenu(HMENU hMenu, CInputHandler *ih) const; + bool BuildMiscCtxMenu(HMENU hMenu, CInputHandler *ih) const; + bool BuildSelectionCtxMenu(HMENU hMenu, CInputHandler *ih) const; + bool BuildGrowShrinkCtxMenu(HMENU hMenu, CInputHandler *ih) const; + bool BuildNoteInterpolationCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const; + bool BuildVolColInterpolationCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const; + bool BuildEffectInterpolationCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const; + bool BuildEditCtxMenu(HMENU hMenu, CInputHandler *ih, CModDoc* pModDoc) const; + bool BuildVisFXCtxMenu(HMENU hMenu, CInputHandler *ih) const; + bool BuildRandomCtxMenu(HMENU hMenu, CInputHandler *ih) const; + bool BuildTransposeCtxMenu(HMENU hMenu, CInputHandler *ih) const; + bool BuildSetInstCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const; + bool BuildAmplifyCtxMenu(HMENU hMenu, CInputHandler *ih) const; + bool BuildChannelMiscCtxMenu(HMENU hMenu, CSoundFile *pSndFile) const; + bool BuildPCNoteCtxMenu(HMENU hMenu, CInputHandler *ih, CSoundFile *pSndFile) const; - bool IsInterpolationPossible(ROWINDEX startRow, ROWINDEX endRow, CHANNELINDEX chan, PatternColumns colType, CSoundFile* pSndFile); + ROWINDEX GetSelectionStartRow() const; + ROWINDEX GetSelectionEndRow() const; + CHANNELINDEX GetSelectionStartChan() const; + CHANNELINDEX GetSelectionEndChan() const; + UINT ListChansWhereColSelected(PatternColumns colType, CArray<UINT, UINT> &chans) const; + + bool IsInterpolationPossible(ROWINDEX startRow, ROWINDEX endRow, CHANNELINDEX chan, PatternColumns colType, CSoundFile *pSndFile) const; void Interpolate(PatternColumns type); // Return true if recording live (i.e. editing while following playback). // rSndFile must be the CSoundFile object of given rModDoc. - bool IsLiveRecord(const CModDoc& rModDoc, const CSoundFile& rSndFile) const; - bool IsLiveRecord(const CMainFrame& rMainFrm, const CModDoc& rModDoc, const CSoundFile& rSndFile) const; + bool IsLiveRecord(const CModDoc &rModDoc, const CSoundFile &rSndFile) const + { + return IsLiveRecord(*CMainFrame::GetMainFrame(), rModDoc, rSndFile); + }; + bool IsLiveRecord(const CMainFrame &rMainFrm, const CModDoc &rModDoc, const CSoundFile &rSndFile) const + { + // (following song) && (following in correct document) && (playback is on) + return ((m_dwStatus & PATSTATUS_FOLLOWSONG) && (rMainFrm.GetFollowSong(&rModDoc) == m_hWnd) && !(rSndFile.IsPaused())); + }; // If given edit positions are valid, sets them to iRow and iPat. // If not valid, set edit cursor position. - void SetEditPos(const CSoundFile& rSndFile, - ROWINDEX& iRow, PATTERNINDEX& iPat, + void SetEditPos(const CSoundFile &rSndFile, + ROWINDEX &iRow, PATTERNINDEX &iPat, const ROWINDEX iRowCandidate, const PATTERNINDEX iPatCandidate) const; // Returns edit position. - ModCommandPos GetEditPos(CSoundFile& rSf, const bool bLiveRecord) const; + ModCommandPos GetEditPos(CSoundFile &rSf, const bool bLiveRecord) const; // Returns pointer to modcommand at given position. If the position is not valid, returns pointer // to a dummy command. - MODCOMMAND* GetModCommand(CSoundFile& rSf, const ModCommandPos& pos); + MODCOMMAND* GetModCommand(CSoundFile &rSf, const ModCommandPos &pos); - bool IsEditingEnabled() const {return ((m_dwStatus&PATSTATUS_RECORD) != 0);} + // Returns true if pattern editing is enabled. + bool IsEditingEnabled() const { return ((m_dwStatus & PATSTATUS_RECORD) != 0); } - //Like IsEditingEnabled(), but shows some notification when editing is not enabled. + // Like IsEditingEnabled(), but shows some notification when editing is not enabled. bool IsEditingEnabled_bmsg(); // Play one pattern row and stop ("step mode") @@ -427,19 +436,6 @@ }; -inline bool CViewPattern::IsLiveRecord(const CMainFrame& rMainFrm, const CModDoc& rModDoc, const CSoundFile& rSndFile) const -//---------------------------------------------------------------------------- -{ // (following song) && (following in correct document(?)) && (playback is on) - return ((m_dwStatus & PATSTATUS_FOLLOWSONG) && (rMainFrm.GetFollowSong(&rModDoc) == m_hWnd) && !(rSndFile.IsPaused())); -} - - -inline bool CViewPattern::IsLiveRecord(const CModDoc& rModDoc, const CSoundFile& rSndFile) const -//---------------------------------------------------------------------------- -{ - return IsLiveRecord(*CMainFrame::GetMainFrame(), rModDoc, rSndFile); -} - #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |