From: <rel...@us...> - 2008-10-13 15:19:24
|
Revision: 228 http://modplug.svn.sourceforge.net/modplug/?rev=228&view=rev Author: relabsoluness Date: 2008-10-13 15:19:08 +0000 (Mon, 13 Oct 2008) Log Message: ----------- / PitchShift and time stretching are back. PitchShift wasn't affected by the license problem so its back as it was, and time stretching is now implemented with SoundTouch-library. SoundTouch is used from delay loaded DLL so the main program should work even if the library is not available. / Pitchshifting/Time Stretching of 8-bit samples is now disabled (didn't seem to work). + A few new methods added to MODINSTRUMENT for readability and easier usage. / Restored default orderlist margins to two. + Added new inisetting that can be used to show/hide some hack GUI controls. / Rearranged control tab order in sample control to make tooltips work in it(don't know why it matters). / mptrack now produces program database(pdb-file) also on release build. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Ctrl_smp.h trunk/OpenMPT/mptrack/MPTRACK.sln trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/mptrack.vcproj trunk/OpenMPT/mptrack/res/MPTRACK.RC2 trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2008-10-13 15:19:08 UTC (rev 228) @@ -13,7 +13,6 @@ ////////////////////////////////////////////////////////////// // CCtrlPatterns -bool CCtrlPatterns::s_ShowSequenceMarginsControls = false; BEGIN_MESSAGE_MAP(CCtrlPatterns, CModControlDlg) //{{AFX_MSG_MAP(CCtrlPatterns) @@ -172,7 +171,7 @@ m_SpinInstrument.SetRange(-1, 1); m_SpinInstrument.SetPos(0); - if(s_ShowSequenceMarginsControls == true) + if(CMainFrame::gbShowHackControls == true) { m_SpinOrderListMargins.ShowWindow(SW_SHOW); m_EditOrderListMargins.ShowWindow(SW_SHOW); Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2008-10-13 15:19:08 UTC (rev 228) @@ -144,9 +144,6 @@ // -! NEW_FEATURE#0012 public: - static bool s_ShowSequenceMarginsControls; - -public: CCtrlPatterns(); LONG* GetSplitPosRef() {return &CMainFrame::glPatternWindowHeight;} //rewbs.varWindowSize Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2008-10-13 15:19:08 UTC (rev 228) @@ -9,10 +9,14 @@ #include "dlg_misc.h" #include "PSRatioCalc.h" //rewbs.timeStretchMods #include "mpdlgs.h" +#include "soundtouch/SoundTouch.h" +#include "soundtouch/TDStretch.h" +#pragma warning(disable:4244) //"conversion from 'type1' to 'type2', possible loss of data" +#include "smbPitchShift.cpp" +#pragma warning(default:4244) //"conversion from 'type1' to 'type2', possible loss of data" -#ifndef NO_XSOUNDLIB - #include "smbPitchShift.h" - #include "samplerate.h" +#ifdef _DEBUG + #define new DEBUG_NEW #endif #ifdef _DEBUG @@ -64,15 +68,11 @@ ON_COMMAND(IDC_CHECK1, OnSetPanningChanged) ON_COMMAND(ID_PREVINSTRUMENT, OnPrevInstrument) ON_COMMAND(ID_NEXTINSTRUMENT, OnNextInstrument) - -#ifndef NO_XSOUNDLIB ON_COMMAND(IDC_BUTTON1, OnPitchShiftTimeStretch) ON_COMMAND(IDC_BUTTON2, OnEstimateSampleSize) ON_COMMAND(IDC_BUTTON3, OnPitchShiftTimeStretchAccept) ON_COMMAND(IDC_BUTTON4, OnPitchShiftTimeStretchCancel) ON_COMMAND(IDC_CHECK3, OnEnableStretchToSize) -#endif - ON_EN_CHANGE(IDC_SAMPLE_NAME, OnNameChanged) ON_EN_CHANGE(IDC_SAMPLE_FILENAME, OnFileNameChanged) ON_EN_CHANGE(IDC_EDIT_SAMPLE, OnSampleChanged) @@ -138,43 +138,39 @@ DDX_Control(pDX, IDC_EDIT14, m_EditVibSweep); DDX_Control(pDX, IDC_EDIT15, m_EditVibDepth); DDX_Control(pDX, IDC_EDIT16, m_EditVibRate); - -#ifndef NO_XSOUNDLIB DDX_Control(pDX, IDC_COMBO4, m_ComboPitch); DDX_Control(pDX, IDC_COMBO5, m_ComboQuality); DDX_Control(pDX, IDC_COMBO6, m_ComboFFT); DDX_Text(pDX, IDC_EDIT6, m_dTimeStretchRatio); //rewbs.timeStretchMods -#endif - //}}AFX_DATA_MAP } -CCtrlSamples::CCtrlSamples() -//-------------------------- +CCtrlSamples::CCtrlSamples() : +//---------------------------- + m_nStretchProcessStepLength(nDefaultStretchChunkSize), + m_nSequenceMs(DEFAULT_SEQUENCE_MS), + m_nSeekWindowMs(DEFAULT_SEEKWINDOW_MS), + m_nOverlapMs(DEFAULT_OVERLAP_MS) { m_nSample = 1; m_nLockCount = 1; - -#ifndef NO_XSOUNDLIB pSampleUndoBuffer = NULL; UndoBufferSize = 0; -#endif - } -#ifndef NO_XSOUNDLIB - CCtrlSamples::~CCtrlSamples() - { - if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer); - pSampleUndoBuffer = NULL; - UndoBufferSize = 0; - } -#endif +CCtrlSamples::~CCtrlSamples() +//--------------------------- +{ + if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer); + pSampleUndoBuffer = NULL; + UndoBufferSize = 0; +} + CRuntimeClass *CCtrlSamples::GetAssociatedViewClass() //--------------------------------------------------- { @@ -241,7 +237,6 @@ } -#ifndef NO_XSOUNDLIB m_ComboFFT.ShowWindow(SW_SHOW); m_ComboPitch.ShowWindow(SW_SHOW); m_ComboQuality.ShowWindow(SW_SHOW); @@ -315,7 +310,6 @@ // Stretch to size check box OnEnableStretchToSize(); -#endif // NO_XSOUNDLIB return TRUE; } @@ -337,9 +331,7 @@ if (pSndFile->m_nSamples < 1) pSndFile->m_nSamples = 1; if ((nSmp < 1) || (nSmp > pSndFile->m_nSamples)) return FALSE; -#ifndef NO_XSOUNDLIB if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel(); -#endif LockControls(); if (m_nSample != nSmp) @@ -511,6 +503,9 @@ return TRUE; } break; + case IDC_EDIT_STRETCHPARAMS: + wsprintf(pszText, "SequenceMs SeekwindowMs OverlapMs ProcessStepLength"); + return TRUE; } } return FALSE; @@ -683,11 +678,8 @@ DWORD len; BOOL bOk; -#ifndef NO_XSOUNDLIB if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel(); -#endif - BeginWaitCursor(); if ((!lpszFileName) || (!f.Open(lpszFileName))) { @@ -803,11 +795,8 @@ { if ((!pSndFile) || (!nSample) || (nSample > pSndFile->m_nSamples)) return FALSE; -#ifndef NO_XSOUNDLIB if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel(); -#endif - BeginWaitCursor(); BEGIN_CRITICAL(); m_pSndFile->DestroySample(m_nSample); @@ -835,10 +824,7 @@ { if ((!IsLocked()) && (m_pSndFile)) { - -#ifndef NO_XSOUNDLIB if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel(); -#endif UINT n = GetDlgItemInt(IDC_EDIT_SAMPLE); if ((n > 0) && (n <= m_pSndFile->m_nSamples) && (n != m_nSample)) @@ -878,10 +864,7 @@ LONG smp = m_pModDoc->InsertSample(TRUE); if (smp > 0) { - - #ifndef NO_XSOUNDLIB if(pSampleUndoBuffer) OnPitchShiftTimeStretchCancel(); - #endif CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); SetCurrentSample(smp); @@ -1431,25 +1414,68 @@ } -#ifndef NO_XSOUNDLIB - #define MAX_BUFFER_LENGTH 8192 #define CLIP_SOUND(v) v = v < -1.0f ? -1.0f : v > 1.0f ? 1.0f : v +void CCtrlSamples::ReadTimeStretchParameters() +//-------------------------------------------- +{ + CString str; + GetDlgItemText(IDC_EDIT_STRETCHPARAMS, str); + _stscanf(str, __TEXT("%u %u %u %u"), + &m_nSequenceMs, &m_nSeekWindowMs, &m_nOverlapMs, &m_nStretchProcessStepLength); +} + + +void CCtrlSamples::UpdateTimeStretchParameterString() +//--------------------------------------------------- +{ + CString str; + str.Format(__TEXT("%u %u %u %u"), + m_nSequenceMs, + m_nSeekWindowMs, + m_nOverlapMs, + m_nStretchProcessStepLength + ); + SetDlgItemText(IDC_EDIT_STRETCHPARAMS, str); +} + void CCtrlSamples::OnEnableStretchToSize() +//---------------------------------------- { // Enable time-stretching / disable unused pitch-shifting UI elements if(IsDlgButtonChecked(IDC_CHECK3)){ ((CComboBox *)GetDlgItem(IDC_COMBO4))->EnableWindow(FALSE); ((CEdit *)GetDlgItem(IDC_EDIT6))->EnableWindow(TRUE); ((CButton *)GetDlgItem(IDC_BUTTON2))->EnableWindow(TRUE); //rewbs.timeStretchMods + GetDlgItem(IDC_TEXT_QUALITY)->ShowWindow(SW_HIDE); + GetDlgItem(IDC_COMBO5)->ShowWindow(SW_HIDE); + GetDlgItem(IDC_TEXT_FFT)->ShowWindow(SW_HIDE); + GetDlgItem(IDC_COMBO6)->ShowWindow(SW_HIDE); + GetDlgItem(IDC_TEXT_PITCH)->ShowWindow(SW_HIDE); + GetDlgItem(IDC_COMBO4)->ShowWindow(SW_HIDE); + if(CMainFrame::gbShowHackControls == true) + { + GetDlgItem(IDC_TEXT_STRETCHPARAMS)->ShowWindow(SW_SHOW); + GetDlgItem(IDC_EDIT_STRETCHPARAMS)->ShowWindow(SW_SHOW); + } SetDlgItemText(IDC_BUTTON1, "Time Stretch"); + UpdateTimeStretchParameterString(); } // Enable pitch-shifting / disable unused time-stretching UI elements else{ + ReadTimeStretchParameters(); + GetDlgItem(IDC_TEXT_QUALITY)->ShowWindow(SW_SHOW); + GetDlgItem(IDC_COMBO5)->ShowWindow(SW_SHOW); + GetDlgItem(IDC_TEXT_FFT)->ShowWindow(SW_SHOW); + GetDlgItem(IDC_COMBO6)->ShowWindow(SW_SHOW); ((CComboBox *)GetDlgItem(IDC_COMBO4))->EnableWindow(TRUE); ((CEdit *)GetDlgItem(IDC_EDIT6))->EnableWindow(FALSE); ((CButton *)GetDlgItem(IDC_BUTTON2))->EnableWindow(FALSE); //rewbs.timeStretchMods + GetDlgItem(IDC_TEXT_STRETCHPARAMS)->ShowWindow(SW_HIDE); + GetDlgItem(IDC_EDIT_STRETCHPARAMS)->ShowWindow(SW_HIDE); + GetDlgItem(IDC_TEXT_PITCH)->ShowWindow(SW_SHOW); + GetDlgItem(IDC_COMBO4)->ShowWindow(SW_SHOW); SetDlgItemText(IDC_BUTTON1, "Pitch Shift"); } } @@ -1519,11 +1545,14 @@ UpdateData(TRUE); //Ensure m_dTimeStretchRatio is up-to-date with textbox content errorcode = TimeStretch(m_dTimeStretchRatio/100.0); - //Update loop points - pins->nLoopStart *= m_dTimeStretchRatio/100.0; - pins->nLoopEnd *= m_dTimeStretchRatio/100.0; - pins->nSustainStart *= m_dTimeStretchRatio/100.0; - pins->nSustainEnd *= m_dTimeStretchRatio/100.0; + //Update loop points only if no error occured. + if(errorcode == 0) + { + pins->nLoopStart *= m_dTimeStretchRatio/100.0; + pins->nLoopEnd *= m_dTimeStretchRatio/100.0; + pins->nSustainStart *= m_dTimeStretchRatio/100.0; + pins->nSustainEnd *= m_dTimeStretchRatio/100.0; + } //end rewbs.timeStretchMods } @@ -1574,6 +1603,12 @@ break; case 3 : wsprintf(str,"Not enough memory..."); break; + case 4 : wsprintf(str, "Action can be applied only to 16-bit samples."); + break; + case 5 : wsprintf(str, "Too low sample rate"); + break; + case 6 : wsprintf(str, "Too short sample"); + break; default: wsprintf(str,"Unknown Error..."); break; } @@ -1586,6 +1621,7 @@ } void CCtrlSamples::OnPitchShiftTimeStretchAccept() +//------------------------------------------------ { // Free sample undo buffer if(pSampleUndoBuffer) CSoundFile::FreeSample(pSampleUndoBuffer); @@ -1662,12 +1698,25 @@ m_pModDoc->SetModified(); } + int CCtrlSamples::TimeStretch(double ratio) +//----------------------------------------- { if((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return -1; MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; if(!pins) return -1; + // Stretching is implemented only for 16-bit samples. Return with + // error if trying to use wtih non 16-bit samples. + if(pins->GetElementarySampleSize() != 2) + return 4; + + // SoundTouch seems to crash with short samples. Don't know what + // the actual limit or whether it depends on sample rate, + // but simply set some semiarbitrary threshold here. + if(pins->nLength < 256) + return 6; + // Refuse processing when ratio is negative, equal to zero or equal to 1.0 if(ratio <= 0.0 || ratio == 1.0) return -1; @@ -1676,42 +1725,31 @@ if(pitch < 0.5f) return 2 + (1<<8); if(pitch > 2.0f) return 2 + (2<<8); + soundtouch::SoundTouch* pSoundTouch = 0; + try + { + pSoundTouch = new soundtouch::SoundTouch; + } + catch(...) + { // Assuming that thrown exception means that soundtouch library could not be loaded. + MessageBox("Failed to load soundtouch library.", 0, MB_ICONERROR); + return -1; + } + // Get number of channels & sample size - BYTE smpsize = (pins->uFlags & CHN_16BIT) ? 2 : 1; - UINT nChn = (pins->uFlags & CHN_STEREO) ? 2 : 1; + const BYTE smpsize = pins->GetElementarySampleSize(); + const UINT nChn = pins->GetNumChannels(); // Allocate new sample - DWORD newsize = (DWORD)(0.5 + ratio * (double)pins->nLength); + const DWORD nNewSampleLength = (DWORD)(0.5 + ratio * (double)pins->nLength); PVOID pSample = pins->pSample; - PVOID pNewSample = CSoundFile::AllocateSample(newsize * nChn * smpsize); - if(pNewSample == NULL) return 3; + PVOID pNewSample = CSoundFile::AllocateSample(nNewSampleLength * nChn * smpsize); + if(pNewSample == NULL) + { + delete pSoundTouch; + return 3; + } - // Apply pitch-shifting step - PitchShift(pitch); - - // Allocate working buffers - UINT outputsize = (UINT)(0.5 + ratio * (double)MAX_BUFFER_LENGTH); - if( (outputsize & 1) && (smpsize == 2 || nChn == 2) ) outputsize++; - - float * buffer = new float[MAX_BUFFER_LENGTH * nChn]; - float * outbuf = new float[outputsize * nChn]; - - // Create resampler - int error; - SRC_STATE * resampler = src_new(SRC_SINC_BEST_QUALITY, nChn, &error) ; - - // Fill in resampler data struct - SRC_DATA data; - data.data_in = &buffer[0]; - data.input_frames = MAX_BUFFER_LENGTH; - data.data_out = &outbuf[0]; - data.output_frames = outputsize; - data.src_ratio = ratio; - data.end_of_input = 0; - - // Deduce max sample value (float conversion step) - float maxSampleValue = ( 1 << (smpsize * 8 - 1) ) - 1; - // Save process button text (to be used as "progress bar" indicator while processing) CHAR oldText[255]; GetDlgItemText(IDC_BUTTON1, oldText, 255); @@ -1732,16 +1770,58 @@ // Show wait mouse cursor BeginWaitCursor(); - SetDlgItemText(IDC_STATIC1,"Resampling..."); + SetDlgItemText(IDC_STATIC1, "Stretching..."); - // Apply stretching (resampling) step - UINT pos = 0, posnew = 0; - UINT len = MAX_BUFFER_LENGTH; + UINT pos = 0; + UINT len = 0; //To contain length of processing step. - // Process sample buffer using MAX_BUFFER_LENGTH (max) sized chunk steps (in order to allow - // the processing of BIG samples...) - while(pos < pins->nLength){ + // Initialize soundtouch object. + { + const uint32 nSampleRate = pins->GetSampleRate(m_pSndFile->GetType()); + if(nSampleRate < 300) // Too low samplerate crashes soundtouch. + { // Limiting it to value 300(quite arbitrarily chosen). + delete pSoundTouch; + return 5; + } + pSoundTouch->setSampleRate(nSampleRate); + pSoundTouch->setChannels(nChn); + // Given ratio is time stretch ratio, and must be converted to + // tempo change ratio: for example time stretch ratio 2 means + // tempo change ratio 0.5. + pSoundTouch->setTempoChange( (1.0f / ratio - 1.0f) * 100.0f); + pSoundTouch->setSetting(SETTING_USE_QUICKSEEK, 0); + // Read settings from GUI. + ReadTimeStretchParameters(); + + if(m_nStretchProcessStepLength == 0) m_nStretchProcessStepLength = nDefaultStretchChunkSize; + if(m_nStretchProcessStepLength < 64) m_nStretchProcessStepLength = nDefaultStretchChunkSize; + len = m_nStretchProcessStepLength; + + // Set settings to soundtouch. Zero value means 'use default', and + // setting value is read back after setting because not all settings are accepted. + if(m_nSequenceMs == 0) m_nSequenceMs = DEFAULT_SEQUENCE_MS; + pSoundTouch->setSetting(SETTING_SEQUENCE_MS, m_nSequenceMs); + m_nSequenceMs = pSoundTouch->getSetting(SETTING_SEQUENCE_MS); + + if(m_nSeekWindowMs == 0) m_nSeekWindowMs = DEFAULT_SEEKWINDOW_MS; + pSoundTouch->setSetting(SETTING_SEEKWINDOW_MS, m_nSeekWindowMs); + m_nSeekWindowMs = pSoundTouch->getSetting(SETTING_SEEKWINDOW_MS); + + if(m_nOverlapMs == 0) m_nOverlapMs = DEFAULT_OVERLAP_MS; + pSoundTouch->setSetting(SETTING_OVERLAP_MS, m_nOverlapMs); + m_nOverlapMs = pSoundTouch->getSetting(SETTING_OVERLAP_MS); + + // Update GUI with the actual SoundTouch parameters in effect. + UpdateTimeStretchParameterString(); + } + + // Keeps count of the sample length received from stretching process. + UINT nLengthCounter = 0; + + // Process sample in steps. + while(pos < pins->nLength) + { // Current chunk size limit test if(pos + len >= pins->nLength) len = pins->nLength - pos; @@ -1759,58 +1839,26 @@ ::DrawText(processButtonDC,progress,strlen(progress),&processButtonRect,DT_CENTER | DT_SINGLELINE | DT_VCENTER); ::GdiFlush(); - // Convert current channel's data chunk to float - BYTE * ptr = (BYTE *)pSample + pos * smpsize * nChn; + // Send sampledata for processing. + pSoundTouch->putSamples(reinterpret_cast<int16*>(pins->pSample + pos * smpsize * nChn), len); - for(UINT j = 0 ; j < len ; j++){ - switch(smpsize){ - case 2: - buffer[j*nChn] = ((float)(*(SHORT *)ptr)) / maxSampleValue; - if(nChn == 2) { ptr += 2; buffer[j*nChn+1] = ((float)(*(SHORT *)ptr)) / maxSampleValue; } - break; - case 1: - buffer[j*nChn] = ((float)*ptr) / maxSampleValue; - if(nChn == 2) { ptr++; buffer[j*nChn+1] = ((float)*ptr) / maxSampleValue; } - break; - } - ptr += smpsize; - } + // Receive some processed samples (it's not guaranteed that there is any available). + nLengthCounter += pSoundTouch->receiveSamples(reinterpret_cast<int16*>(pNewSample) + nChn * nLengthCounter, nNewSampleLength - nLengthCounter); - // Wake up resampler... - if(pos + MAX_BUFFER_LENGTH >= pins->nLength) data.end_of_input = 1; - src_process(resampler, &data); - - // New buffer limit test (seems like, whatever the size of the last chunk, the resampler return buffer size instead of processed size) - if(data.end_of_input && posnew + (UINT)data.output_frames_gen >= newsize) data.output_frames_gen = newsize - posnew; - - // Convert resampled float buffer into new sample buffer - ptr = (BYTE *)pNewSample + posnew * smpsize * nChn; - - for(UINT j = 0 ; j < (UINT)data.output_frames_gen ; j++){ - // Just perform a little bit of clipping... - float v = outbuf[j*nChn]; CLIP_SOUND(v); - // ...before converting back to buffer - switch(smpsize){ - case 2: - *(SHORT *)ptr = (SHORT)(v * maxSampleValue); - if(nChn == 2) { ptr += 2; v = outbuf[j*nChn+1]; CLIP_SOUND(v); *(SHORT *)ptr = (SHORT)(v * maxSampleValue); } - break; - case 1: - *ptr = (BYTE)(v * maxSampleValue); - if(nChn == 2) { ptr++; v = outbuf[j*nChn+1]; CLIP_SOUND(v); *ptr = (BYTE)(v * maxSampleValue); } - break; - } - ptr += smpsize; - } - // Next buffer chunk - posnew += data.output_frames_gen; - pos += MAX_BUFFER_LENGTH; + pos += len; } - // Update newsize with generated size - newsize = posnew; + // The input sample should now be processed. Receive remaining samples. + pSoundTouch->flush(); + while(pSoundTouch->numSamples() > 0 && nNewSampleLength > nLengthCounter) + { + nLengthCounter += pSoundTouch->receiveSamples(reinterpret_cast<int16*>(pNewSample) + nChn * nLengthCounter, nNewSampleLength - nLengthCounter); + } + delete pSoundTouch; pSoundTouch = 0; + ASSERT(nNewSampleLength >= nLengthCounter); + // Swap sample buffer pointer to new buffer, update song + sample data & free old sample buffer BEGIN_CRITICAL(); for(UINT i=0 ; i < MAX_CHANNELS ; i++){ @@ -1822,17 +1870,9 @@ } pins->pSample = (LPSTR)pNewSample; CSoundFile::FreeSample(pSample); - pins->nLength = newsize; + pins->nLength = min(nLengthCounter, nNewSampleLength); END_CRITICAL(); - // Free working buffers - data.data_in = data.data_out = NULL; - if(buffer) delete [] buffer; - if(outbuf) delete [] outbuf; - - // Free resampler - if(resampler) src_delete(resampler); - // Free progress bar brushes DeleteObject((HBRUSH)green); DeleteObject((HBRUSH)red); @@ -1848,6 +1888,7 @@ } int CCtrlSamples::PitchShift(float pitch) +//--------------------------------------- { if((!m_pSndFile) || (!m_pSndFile->Ins[m_nSample].pSample)) return -1; if(pitch < 0.5f) return 1 + (1<<8); @@ -1857,6 +1898,11 @@ MODINSTRUMENT *pins = &m_pSndFile->Ins[m_nSample]; if(!pins) return 2; + // PitchShift seems to work only with 16-bit samples. Return with + // error if trying to use non 16-bit samples. + if(pins->GetElementarySampleSize() != 2) + return 4; + // Get number of channels & sample size BYTE smpsize = (pins->uFlags & CHN_16BIT) ? 2 : 1; UINT nChn = (pins->uFlags & CHN_STEREO) ? 2 : 1; @@ -2013,9 +2059,7 @@ return 0; } -#endif // NO_XSOUNDLIB - void CCtrlSamples::OnReverse() //---------------------------- { Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.h 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/Ctrl_smp.h 2008-10-13 15:19:08 UTC (rev 228) @@ -1,10 +1,7 @@ #ifndef _CONTROL_SAMPLES_H_ #define _CONTROL_SAMPLES_H_ -// If defined, disables pitch shifting - time stretching. -#define NO_XSOUNDLIB - //======================================= class CCtrlSamples: public CModControlDlg //======================================= @@ -22,25 +19,25 @@ CButton m_CheckPanning; UINT m_nSample; double m_dTimeStretchRatio; //rewbs.timeStretchMods - + uint32 m_nStretchProcessStepLength; + uint32 m_nSequenceMs; + uint32 m_nSeekWindowMs; + uint32 m_nOverlapMs; + enum {nDefaultStretchChunkSize = 8192}; -#ifndef NO_XSOUNDLIB CComboBox m_ComboPitch, m_ComboQuality, m_ComboFFT; PVOID pSampleUndoBuffer; UINT UndoBufferSize; int PitchShift(float pitch); int TimeStretch(double ratio); -#endif + void UpdateTimeStretchParameterString(); + void ReadTimeStretchParameters(); public: CCtrlSamples(); - -#ifndef NO_XSOUNDLIB ~CCtrlSamples(); -#endif -public: BOOL SetCurrentSample(UINT n, LONG lZoom=-1, BOOL bUpdNum=TRUE); BOOL OpenSample(LPCSTR lpszFileName); BOOL OpenSample(CSoundFile *pSndFile, UINT nSample); @@ -96,13 +93,11 @@ afx_msg void OnVScroll(UINT, UINT, CScrollBar *); afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //rewbs.customKeys -#ifndef NO_XSOUNDLIB afx_msg void OnPitchShiftTimeStretch(); afx_msg void OnEnableStretchToSize(); afx_msg void OnEstimateSampleSize(); afx_msg void OnPitchShiftTimeStretchAccept(); afx_msg void OnPitchShiftTimeStretchCancel(); -#endif //}}AFX_MSG DECLARE_MESSAGE_MAP() Modified: trunk/OpenMPT/mptrack/MPTRACK.sln =================================================================== --- trunk/OpenMPT/mptrack/MPTRACK.sln 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/MPTRACK.sln 2008-10-13 15:19:08 UTC (rev 228) @@ -3,6 +3,7 @@ ProjectSection(ProjectDependencies) = postProject {1FF4AB04-B22F-4CB8-AA2A-0C5095B5FEE4} = {1FF4AB04-B22F-4CB8-AA2A-0C5095B5FEE4} {71531076-78C7-488D-8FD6-9D841F20AADE} = {71531076-78C7-488D-8FD6-9D841F20AADE} + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896} = {CF3C2CA5-5D45-4635-BBA4-C1F435E10896} {3C7281B0-D0E2-48ED-AE4D-A181FC77D8F7} = {3C7281B0-D0E2-48ED-AE4D-A181FC77D8F7} EndProjectSection EndProject @@ -22,6 +23,10 @@ ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "soundtouch", "..\soundtouch\soundtouch.vcproj", "{CF3C2CA5-5D45-4635-BBA4-C1F435E10896}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug @@ -50,6 +55,10 @@ {DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Debug.Build.0 = Debug|Win32 {DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Release.ActiveCfg = Release|Win32 {DCC2BB2F-6778-4FD3-9C00-D6CD8DC917B8}.Release.Build.0 = Release|Win32 + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Debug.ActiveCfg = Debug|Win32 + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Debug.Build.0 = Debug|Win32 + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Release.ActiveCfg = Release|Win32 + {CF3C2CA5-5D45-4635-BBA4-C1F435E10896}.Release.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2008-10-13 15:19:08 UTC (rev 228) @@ -133,6 +133,7 @@ UINT CMainFrame::m_nFilterIndex = 0; UINT CMainFrame::m_nLastOptionsPage = 0; BOOL CMainFrame::gbMdiMaximize = FALSE; +bool CMainFrame::gbShowHackControls = false; //rewbs.varWindowSize LONG CMainFrame::glCtrlWindowHeight = 188; //obsolete, for backwards compat only LONG CMainFrame::glGeneralWindowHeight = 178; @@ -427,8 +428,8 @@ gbPatternPluginNames = GetPrivateProfileDWord("Pattern Editor", "Plugin-Names", true, iniFile); gbPatternRecord = GetPrivateProfileDWord("Pattern Editor", "Record", true, iniFile); gnAutoChordWaitTime = GetPrivateProfileDWord("Pattern Editor", "AutoChordWaitTime", 60, iniFile); - CCtrlPatterns::s_ShowSequenceMarginsControls = (0 != GetPrivateProfileDWord("Pattern Editor", "ShowSequenceMarginsControls", 0, iniFile)); - COrderList::s_nDefaultMargins = static_cast<BYTE>(GetPrivateProfileInt("Pattern Editor", "DefaultSequenceMargins", 0, iniFile)); + COrderList::s_nDefaultMargins = static_cast<BYTE>(GetPrivateProfileInt("Pattern Editor", "DefaultSequenceMargins", 2, iniFile)); + gbShowHackControls = (0 != GetPrivateProfileDWord("Misc", "ShowHackControls", 0, iniFile)); GetPrivateProfileString("Paths", "Songs_Directory", m_szModDir, m_szModDir, INIBUFFERSIZE, iniFile); GetPrivateProfileString("Paths", "Samples_Directory", m_szSmpDir, m_szSmpDir, INIBUFFERSIZE, iniFile); Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2008-10-13 15:19:08 UTC (rev 228) @@ -365,6 +365,7 @@ // Globals static UINT m_nLastOptionsPage, m_nFilterIndex; static BOOL gbMdiMaximize; + static bool gbShowHackControls; static LONG glCtrlWindowHeight, glTreeWindowWidth, glTreeSplitRatio; static LONG glGeneralWindowHeight, glPatternWindowHeight, glSampleWindowHeight, glInstrumentWindowHeight, glCommentsWindowHeight, glGraphWindowHeight; //rewbs.varWindowSize Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/mptrack.rc 2008-10-13 15:19:08 UTC (rev 228) @@ -675,23 +675,15 @@ BEGIN CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | 0x4d,4,4,55,17 - RTEXT "Sample",IDC_STATIC,62,8,24,8 EDITTEXT IDC_EDIT_SAMPLE,90,6,35,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Spin6",IDC_SPIN_SAMPLE,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,118,4,11,14 COMBOBOX IDC_COMBO_ZOOM,131,6,41,89,CBS_DROPDOWNLIST | WS_VSCROLL - CTEXT "Length: 000000 (16-bit)",IDC_TEXT5,175,6,90,13, - SS_CENTERIMAGE,WS_EX_STATICEDGE - CONTROL "Toolbar2",IDC_TOOLBAR2,"ToolbarWindow32",WS_GROUP | - 0x4d,268,4,136,17 - GROUPBOX "",IDC_STATIC,3,22,94,78 - LTEXT "Default Volume",IDC_STATIC,8,32,49,8 EDITTEXT IDC_EDIT7,57,30,36,12,ES_NUMBER CONTROL "Spin1",IDC_SPIN7,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,29, 11,11 - LTEXT "Global Volume",IDC_STATIC,8,45,46,8 EDITTEXT IDC_EDIT8,57,43,36,12,ES_NUMBER CONTROL "Spin1",IDC_SPIN8,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,42, @@ -702,79 +694,46 @@ CONTROL "Spin1",IDC_SPIN9,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,56, 11,11 - LTEXT "FineTune",IDC_TEXT7,8,73,37,8 EDITTEXT IDC_EDIT5,48,70,45,12,ES_AUTOHSCROLL CONTROL "Spin1",IDC_SPIN5,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,87,69,11,11 - LTEXT "Transpose",IDC_TEXT6,8,86,38,8 COMBOBOX IDC_COMBO_BASENOTE,48,83,45,89,CBS_DROPDOWNLIST | WS_VSCROLL - CTEXT "Name",IDC_STATIC,102,26,28,12,SS_CENTERIMAGE | NOT - WS_GROUP,WS_EX_STATICEDGE EDITTEXT IDC_SAMPLE_NAME,129,26,135,12,ES_AUTOHSCROLL - CTEXT "File",IDC_STATIC,269,26,23,13,SS_CENTERIMAGE | NOT - WS_GROUP | WS_TABSTOP,WS_EX_STATICEDGE EDITTEXT IDC_SAMPLE_FILENAME,292,26,72,13,ES_AUTOHSCROLL - GROUPBOX "Loop",IDC_STATIC,102,43,79,57 - LTEXT "Type",IDC_STATIC,107,57,17,8 COMBOBOX IDC_COMBO1,130,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP - LTEXT "Start",IDC_STATIC,107,73,16,8 EDITTEXT IDC_EDIT1,130,70,45,12,ES_NUMBER CONTROL "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,69,11,11 - LTEXT "End",IDC_STATIC,107,86,14,8 EDITTEXT IDC_EDIT2,130,83,45,12,ES_NUMBER CONTROL "Spin1",IDC_SPIN2,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,169,84,11,11 - GROUPBOX "Sustain Loop",IDC_STATIC,185,43,79,57 - LTEXT "Type",IDC_STATIC,189,57,17,8 COMBOBOX IDC_COMBO2,212,54,45,46,CBS_DROPDOWNLIST | WS_TABSTOP - LTEXT "Start",IDC_STATIC,189,73,16,8 EDITTEXT IDC_EDIT3,212,70,45,12,ES_NUMBER CONTROL "Spin1",IDC_SPIN3,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,70,11,11 - LTEXT "End",IDC_STATIC,189,86,14,8 EDITTEXT IDC_EDIT4,212,83,45,12,ES_NUMBER CONTROL "Spin1",IDC_SPIN4,"msctls_updown32",UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,253,83,11,11 - GROUPBOX "",IDC_STATIC,269,43,96,57 COMBOBOX IDC_COMBO3,275,59,47,70,CBS_DROPDOWNLIST | WS_TABSTOP - LTEXT "Depth",IDC_STATIC,327,50,20,8 EDITTEXT IDC_EDIT15,327,59,32,12,ES_NUMBER CONTROL "Depth",IDC_SPIN12,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,353,59, 11,11 - LTEXT "Sweep",IDC_STATIC,275,74,23,8 EDITTEXT IDC_EDIT14,275,83,38,12,ES_NUMBER CONTROL "Sweep",IDC_SPIN11,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,305,84, 11,11 - LTEXT "Rate",IDC_STATIC,321,74,16,8 EDITTEXT IDC_EDIT16,321,83,38,12,ES_NUMBER CONTROL "Rate",IDC_SPIN13,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_NOTHOUSANDS,353,83, 11,11 - LTEXT "Auto-Vibrato",IDC_STATIC,275,50,41,8 - GROUPBOX "Pitch shifting / Time stretching", - IDC_GROUPBOX_PITCH_TIME,370,22,150,78,NOT WS_VISIBLE - LTEXT "Pitch",IDC_TEXT_PITCH,374,38,23,10,NOT WS_VISIBLE - LTEXT "Quality",IDC_TEXT_QUALITY,374,54,23,10,NOT WS_VISIBLE - LTEXT "FFT",IDC_TEXT_FFT,374,70,23,10,NOT WS_VISIBLE + CONTROL "Time stretching",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | + BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,446, + 36,68,11 CONTROL "Preview mode",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,373, 83,65,11 - CONTROL "Time stretching",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | - BS_LEFTTEXT | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,446, - 36,68,11 - EDITTEXT IDC_EDIT6,446,51,45,13,ES_RIGHT | ES_AUTOHSCROLL | NOT - WS_VISIBLE,WS_EX_RIGHT - CTEXT "Static",IDC_TEXT_PREVIEW,448,69,67,10,NOT WS_VISIBLE - PUSHBUTTON "Process",IDC_BUTTON1,448,80,67,16,NOT WS_VISIBLE, - WS_EX_CLIENTEDGE - PUSHBUTTON "...",IDC_BUTTON2,502,51,13,13,NOT WS_VISIBLE, - WS_EX_CLIENTEDGE - PUSHBUTTON "Keep",IDC_BUTTON3,448,82,32,13,NOT WS_VISIBLE, - WS_EX_CLIENTEDGE PUSHBUTTON "Restore",IDC_BUTTON4,482,82,33,13,NOT WS_VISIBLE, WS_EX_CLIENTEDGE COMBOBOX IDC_COMBO4,400,35,39,61,CBS_DROPDOWNLIST | NOT @@ -783,7 +742,50 @@ WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP COMBOBOX IDC_COMBO6,400,67,39,61,CBS_DROPDOWNLIST | NOT WS_VISIBLE | WS_VSCROLL | WS_GROUP | WS_TABSTOP + EDITTEXT IDC_EDIT_STRETCHPARAMS,374,51,64,12,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT6,446,51,45,12,ES_RIGHT | ES_AUTOHSCROLL | NOT + WS_VISIBLE,WS_EX_RIGHT + PUSHBUTTON "...",IDC_BUTTON2,502,51,13,13,NOT WS_VISIBLE, + WS_EX_CLIENTEDGE + RTEXT "Sample",IDC_STATIC,62,8,24,8 + CTEXT "Length: 000000 (16-bit)",IDC_TEXT5,175,6,90,13, + SS_CENTERIMAGE,WS_EX_STATICEDGE + CONTROL "Toolbar2",IDC_TOOLBAR2,"ToolbarWindow32",WS_GROUP | + 0x4d,268,4,136,17 + GROUPBOX "",IDC_STATIC,3,22,94,78 + LTEXT "Default Volume",IDC_STATIC,8,32,49,8 + LTEXT "Global Volume",IDC_STATIC,8,45,46,8 + LTEXT "FineTune",IDC_TEXT7,8,73,37,8 + LTEXT "Transpose",IDC_TEXT6,8,86,38,8 + CTEXT "Name",IDC_STATIC,102,26,28,12,SS_CENTERIMAGE | NOT + WS_GROUP,WS_EX_STATICEDGE + CTEXT "File",IDC_STATIC,269,26,23,13,SS_CENTERIMAGE | NOT + WS_GROUP | WS_TABSTOP,WS_EX_STATICEDGE + GROUPBOX "Loop",IDC_STATIC,102,43,79,57 + LTEXT "Type",IDC_STATIC,107,57,17,8 + LTEXT "Start",IDC_STATIC,107,73,16,8 + LTEXT "End",IDC_STATIC,107,86,14,8 + GROUPBOX "Sustain Loop",IDC_STATIC,185,43,79,57 + LTEXT "Type",IDC_STATIC,189,57,17,8 + LTEXT "Start",IDC_STATIC,189,73,16,8 + LTEXT "End",IDC_STATIC,189,86,14,8 + GROUPBOX "",IDC_STATIC,269,43,96,57 + LTEXT "Auto-Vibrato",IDC_STATIC,275,50,41,8 + LTEXT "Sweep",IDC_STATIC,275,74,23,8 + LTEXT "Depth",IDC_STATIC,327,50,20,8 + LTEXT "Rate",IDC_STATIC,321,74,16,8 + GROUPBOX "Pitch shifting / Time stretching", + IDC_GROUPBOX_PITCH_TIME,370,22,150,78,NOT WS_VISIBLE + PUSHBUTTON "Process",IDC_BUTTON1,448,80,67,16,NOT WS_VISIBLE, + WS_EX_CLIENTEDGE + LTEXT "Pitch",IDC_TEXT_PITCH,373,36,23,10,NOT WS_VISIBLE + LTEXT "Quality",IDC_TEXT_QUALITY,374,54,23,10,NOT WS_VISIBLE + LTEXT "FFT",IDC_TEXT_FFT,374,68,23,10,NOT WS_VISIBLE + CTEXT "Static",IDC_TEXT_PREVIEW,448,69,67,10,NOT WS_VISIBLE + PUSHBUTTON "Keep",IDC_BUTTON3,448,82,32,13,NOT WS_VISIBLE, + WS_EX_CLIENTEDGE LTEXT "%",IDC_TEXT_PERCENT,494,53,8,10,NOT WS_VISIBLE + LTEXT "Parameters",IDC_TEXT_STRETCHPARAMS,385,38,39,8 END IDD_CONTROL_INSTRUMENTS DIALOGEX 0, 0, 558, 173 Modified: trunk/OpenMPT/mptrack/mptrack.vcproj =================================================================== --- trunk/OpenMPT/mptrack/mptrack.vcproj 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/mptrack.vcproj 2008-10-13 15:19:08 UTC (rev 228) @@ -24,7 +24,7 @@ AdditionalOptions="/EHsc" Optimization="0" OptimizeForProcessor="1" - AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib" + AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib,..\" PreprocessorDefinitions="_DEBUG,WIN32,_WINDOWS,ENABLE_EQ,MODPLUG_TRACKER,NO_PACKING,HAVE_DOT_NET,ENABLE_AMD,ENABLE_SSE,ENABLE_AMDNOW,ENABLE_MMX" StringPooling="TRUE" BasicRuntimeChecks="3" @@ -48,13 +48,13 @@ <Tool Name="VCLinkerTool" AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib" + AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib delayimp.lib" OutputFile=".\Debug/mptrack.exe" Version="5.0" LinkIncremental="2" SuppressStartupBanner="TRUE" AdditionalLibraryDirectories="" - DelayLoadDLLs="" + DelayLoadDLLs="OpenMPT_soundtouch.dll" GenerateDebugInformation="TRUE" AssemblyDebug="1" ProgramDatabaseFile=".\Debug/mptrack.pdb" @@ -104,7 +104,7 @@ GlobalOptimizations="TRUE" InlineFunctionExpansion="2" OptimizeForWindowsApplication="TRUE" - AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib" + AdditionalIncludeDirectories="..\unlha,..\unzip,..\unrar,..\soundlib,..\include,..\xsoundlib,..\" PreprocessorDefinitions="NDEBUG,WIN32,_WINDOWS,ENABLE_MMX,ENABLE_EQ,MODPLUG_TRACKER,NO_PACKING,HAVE_DOT_NET,ENABLE_AMD,ENABLE_SSE,ENABLE_AMDNOW" StringPooling="TRUE" RuntimeLibrary="0" @@ -119,21 +119,26 @@ ProgramDataBaseFileName=".\Release/" WarningLevel="3" SuppressStartupBanner="FALSE" + DebugInformationFormat="3" CompileAs="0"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" AdditionalOptions="/MACHINE:I386" - AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib" + AdditionalDependencies="winmm.lib strmiids.lib dmoguids.lib version.lib opengl32.lib glu32.lib Rpcrt4.lib delayimp.lib" OutputFile=".\Bin/mptrack.exe" Version="5.0" LinkIncremental="1" SuppressStartupBanner="TRUE" AdditionalLibraryDirectories="" + DelayLoadDLLs="OpenMPT_soundtouch.dll" + GenerateDebugInformation="TRUE" GenerateMapFile="FALSE" MapFileName=".\Release/mptrack.map" - SubSystem="2"/> + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2"/> <Tool Name="VCMIDLTool" PreprocessorDefinitions="NDEBUG" Modified: trunk/OpenMPT/mptrack/res/MPTRACK.RC2 =================================================================== --- trunk/OpenMPT/mptrack/res/MPTRACK.RC2 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/res/MPTRACK.RC2 2008-10-13 15:19:08 UTC (rev 228) @@ -43,7 +43,7 @@ VALUE "FileDescription", "OpenMPT / ModPlug Tracker" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "Modplug Tracker" - VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2007 GPL." + VALUE "LegalCopyright", "Copyright \xA91997-2003 Olivier Lapicque; \xA92004-2008 contributors." VALUE "LegalTrademarks", "M.O.D.P.L.U.G" VALUE "OriginalFilename", "mptrack.exe" VALUE "PrivateBuild", "" Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/mptrack/resource.h 2008-10-13 15:19:08 UTC (rev 228) @@ -818,6 +818,8 @@ #define IDC_TEXT_QUALITY 2330 #define IDC_TEXT_FFT 2331 #define IDC_TEXT_PERCENT 2332 +#define IDC_TEXT_STRETCHPARAMS 2337 +#define IDC_EDIT_STRETCHPARAMS 2338 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1049,7 +1051,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 516 #define _APS_NEXT_COMMAND_VALUE 59212 -#define _APS_NEXT_CONTROL_VALUE 2333 +#define _APS_NEXT_CONTROL_VALUE 2339 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2008-10-13 14:25:58 UTC (rev 227) +++ trunk/OpenMPT/soundlib/Sndfile.h 2008-10-13 15:19:08 UTC (rev 228) @@ -427,14 +427,18 @@ BYTE nVibRate; CHAR name[22]; - //Should return the size which pSample is at least. - DWORD GetSampleSizeInBytes() const - { - DWORD len = nLength; - if(uFlags & CHN_16BIT) len *= 2; - if(uFlags & CHN_STEREO) len *= 2; - return len; - } + // Return the size of one (elementary) sample in bytes. + uint8 GetElementarySampleSize() const {return (uFlags & CHN_16BIT) ? 2 : 1;} + + // Return the number of channels in the sample. + uint8 GetNumChannels() const {return (uFlags & CHN_STEREO) ? 2 : 1;} + + // Return the size which pSample is at least. + DWORD GetSampleSizeInBytes() const {return nLength * GetNumChannels() * GetElementarySampleSize();} + + // Returns sample rate of the sample. The argument is needed because + // the sample rate is obtained differently for different module types. + uint32 GetSampleRate(const MODTYPE type) const; }; @@ -1293,7 +1297,18 @@ long GetSampleOffset(); }; +inline uint32 MODINSTRUMENT::GetSampleRate(const MODTYPE type) const +//------------------------------------------------------------------ +{ + uint32 nRate; + if(type & (MOD_TYPE_MOD|MOD_TYPE_XM)) + nRate = CSoundFile::TransposeToFrequency(RelativeTone, nFineTune); + else + nRate = nC4Speed; + return (nRate > 0) ? nRate : 8363; +} + inline IMixPlugin* CSoundFile::GetInstrumentPlugin(INSTRUMENTINDEX instr) //---------------------------------------------------------------- { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |